国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
Error
Exception
捕獲異常
聲明拋出異常
拋出異常
注意點
getMessage
getLocalizedMessage
getCause
printStackTrace
首頁 Java Java入門 10個Java異常的關(guān)鍵知識點

10個Java異常的關(guān)鍵知識點

Nov 26, 2019 pm 04:54 PM
java 例外

下面這篇文章就來總結(jié)Java異常十個關(guān)鍵知識點,面試或工作中都有用。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

10個Java異常的關(guān)鍵知識點

一.異常是什麼

#異常是指阻止目前方法或作用域繼續(xù)執(zhí)行的問題。例如你讀取的檔案不存在,陣列越界,進(jìn)行除法時,除數(shù)為0等都會導(dǎo)致異常。

【推薦學(xué)習(xí):java影片教學(xué)

一個檔案找不到的異常

public class TestException {	
    public static void main(String[] args) throws IOException {	
        InputStream is = new FileInputStream("jaywei.txt");	
        int b;	
        while ((b = is.read()) != -1) {	
        }	
    }	
}

#運行結(jié)果:

Exception in thread "main" java.io.FileNotFoundException: jaywei.txt (系統(tǒng)找不到指定的文件。)	
    at java.io.FileInputStream.open0(Native Method)	
    at java.io.FileInputStream.open(FileInputStream.java:195)	
    at java.io.FileInputStream.<init>(FileInputStream.java:138)	
    at java.io.FileInputStream.<init>(FileInputStream.java:93)	
    at exception.TestException.main(TestException.java:10)

二. 異常的層次結(jié)構(gòu)

從前,有位老人,他的名字叫Throwable,他生了兩個兒子,大兒子叫Error,二兒子叫Exception。

Error

表示編譯時或系統(tǒng)錯誤,如虛擬機(jī)器相關(guān)的錯誤,OutOfMemoryError等,error是無法處理的。

Exception

程式碼異常,Java程式設(shè)計師關(guān)心的基底類型通常是Exception。它能被程式本身可以處理,這也是它跟Error的差別。

它可以分成RuntimeException(運行時異常)和CheckedException(可檢查的例外)。

常見的RuntimeException例外:

- NullPointerException 空指針異常	
- ArithmeticException 出現(xiàn)異常的運算條件時,拋出此異常	
- IndexOutOfBoundsException 數(shù)組索引越界異常	
- ClassNotFoundException 找不到類異常	
- IllegalArgumentException(非法參數(shù)異常)

常見的Checked Exception 例外:

- IOException (操作輸入流和輸出流時可能出現(xiàn)的異常)	
- ClassCastException(類型轉(zhuǎn)換異常類)

 ● Checked Exception就是編譯器要求你必須處置的異常。

 ● 與之相反的是,Unchecked Exceptions,它指編譯器不要求強(qiáng)制處置的異常,它包括Error和RuntimeException 以及他們的子類。

三、異常處理

當(dāng)異常出現(xiàn)後,會在堆上建立異常物件。目前的執(zhí)行路徑被終止,並且從目前環(huán)境中彈出對異常物件的參考。這時候異常處理程序,使程序從錯誤狀態(tài)恢復(fù),使程序繼續(xù)運作下去。

異常處理主要有拋出例外、捕獲例外、聲明例外。如圖:

捕獲異常

try{	
// 程序代碼	
}catch(Exception e){	
//Catch 塊	
}finaly{	
  //無論如何,都會執(zhí)行的代碼塊	
}

我們可以透過try...catch...捕獲異常代碼,再透過finaly執(zhí)行最後的操作,例如關(guān)閉流程等操作。

聲明拋出異常

除了 try...catch...捕獲異常,我們也可以透過throws聲明拋出異常。

當(dāng)你定義了一個方法時,可以用 throws關(guān)鍵字宣告。使用了 throws關(guān)鍵字表明,該方法不處理異常,而是把異常留給它的呼叫者處理。是不是覺得TA不負(fù)責(zé)任?

哈哈,看一下demo吧

//該方法通過throws聲明了IO異常。	
 private void readFile() throws IOException {	
        InputStream is = new FileInputStream("jaywei.txt");	
        int b;	
        while ((b = is.read()) != -1) {	
        }	
    }

從方法中聲明拋出的任何異常都必須使用throws子句。

拋出異常

throw關(guān)鍵字作用是拋出一個 Throwable類型的異常,它一般出現(xiàn)在函數(shù)體中。在異常處理中,try語句要捕獲的是一個異常對象,其實此異常對像也可以自己拋出。

例如拋出一個 RuntimeException 類別的例外物件:

throw new RuntimeException(e);

任何Java程式碼都可以透過 Java 的throw語句拋出例外。

注意點

 ● 非檢查例外(Error、RuntimeException 或它們的子類別)不可使用 throws 關(guān)鍵字來宣告要拋出的例外。

 ● 一個方法出現(xiàn)編譯時異常,就需要 try-catch/ throws 處理,否則會導(dǎo)致編譯錯誤。

四、try-catch-finally-return執(zhí)行順序

#try-catch-finally-return 執(zhí)行說明

# ● 如果不發(fā)生異常,不會執(zhí)行catch部分。

 ● 不管有沒有發(fā)生異常,finally都會執(zhí)行到。

 ● 即使try和catch中有return時,finally仍然會執(zhí)行

 ● finally是在return後面的表達(dá)式運算完後再執(zhí)行的。 (此時並沒有傳回運算後的值,而是先把要回傳的值保存起來,若finally中無return,則不管finally中的程式碼怎麼樣,傳回的值都不會改變,仍然是之前儲存的值),該情況下函數(shù)回傳值是在finally執(zhí)行前確定的)

 ● finally部分就不要return了,要不然,就回不去try或者catch的return了。

看一個範(fàn)例

 public static void main(String[] args) throws IOException {	
        System.out.println("result:" + test());	
    }	
    private static int test() {	
        int temp = 1;	
        try {	
            System.out.println("start execute try,temp is:"+temp);	
            return ++temp;	
        } catch (Exception e) {	
            System.out.println("start execute catch temp is: "+temp);	
            return ++temp;	
        } finally {	
            System.out.println("start execute finally,temp is:" + temp);	
            ++temp;	
        }	
    }

運行結(jié)果:

start execute try,temp is:1	
start execute finally,temp is:2	
result:2

##分析

 ● 先執(zhí)行try部分,輸出日誌,執(zhí)行?

temp表達(dá)式,temp變成2,這個值被儲存起來。

 ● 因為沒有發(fā)生異常,所以catch代碼塊跳過。

 ● 執(zhí)行finally代碼塊,輸出日志,執(zhí)行 ++temp表達(dá)式.

 ● 返回try部分保存的值2.

五、Java異常類的幾個重要方法

先來喵一眼異常類的所有方法,如下圖:

getMessage

Returns the detail message string of this throwable.

getMessage會返回Throwable的 detailMessage屬性,而 detailMessage就表示發(fā)生異常的詳細(xì)消息描述。

舉個例子, FileNotFoundException異常發(fā)生時,這個 detailMessage就包含這個找不到文件的名字。

getLocalizedMessage

Creates a localized description of this throwable.Subclasses may override this	
method in order to produce alocale-specific message. For subclasses that do not	
override thismethod, the default implementation returns the same result	
as getMessage()

throwable的本地化描述。子類可以重寫此方法,以生成特定于語言環(huán)境的消息。對于不覆蓋此方法的子類,默認(rèn)實現(xiàn)返回與相同的結(jié)果 getMessage()。

getCause

Returns the cause of this throwable or null if thecause is nonexistent or unknown.

返回此可拋出事件的原因,或者,如果原因不存在或未知,返回null。

printStackTrace

Prints this throwable and its backtrace to thestandard error stream.	
The first line of output contains the result of the toString() method for	
this object.Remaining lines represent data previously recorded by the	
method fillInStackTrace().

該方法將堆棧跟蹤信息打印到標(biāo)準(zhǔn)錯誤流。

輸出的第一行,包含此對象toString()方法的結(jié)果。剩余的行表示,先前被方法fillInStackTrace()記錄的數(shù)據(jù)。如下例子:

 java.lang.NullPointerException	
         at MyClass.mash(MyClass.java:9)	
         at MyClass.crunch(MyClass.java:6)	
         at MyClass.main(MyClass.java:3)

六、自定義異常

自定義異常通常是定義一個繼承自 Exception 類的子類。

那么,為什么需要自定義異常?

 ● Java提供的異常體系不可能預(yù)見所有的錯誤。

 ● 業(yè)務(wù)開發(fā)中,使用自定義異常,可以讓項目代碼更加規(guī)范,也便于管理。

下面是我司自定義異常類的一個簡單demo

public class BizException extends Exception {	
    //錯誤信息	
    private String message;	
    //錯誤碼	
    private String errorCode;	
    public BizException() {	
    }	
    public BizException(String message, String errorCode) {	
        this.message = message;	
        this.errorCode = errorCode;	
    }	
    @Override	
    public String getMessage() {	
        return message;	
    }	
    public void setMessage(String message) {	
        this.message = message;	
    }	
    public String getErrorCode() {	
        return errorCode;	
    }	
    public void setErrorCode(String errorCode) {	
        this.errorCode = errorCode;	
    }	
}

跑個main方測試一下

public class TestBizException {	
    public static void testBizException() throws BizException {	
        System.out.println("throwing BizException from testBizException()");	
        throw new BizException("100","哥,我錯了");	
    }	
    public static void main(String[] args) {	
        try {	
            testBizException();	
        } catch (BizException e) {	
            System.out.println("自己定義的異常");	
            e.printStackTrace();	
        }	
    }	
}

運行結(jié)果:

exception.BizException: 100	
throwing BizException from testBizException()	
自己定義的異常	
    at exception.TestBizException.testBizException(TestBizException.java:7)	
    at exception.TestBizException.main(TestBizException.java:12)

七、Java7 新的 try-with-resources語句

try-with-resources,是Java7提供的一個新功能,它用于自動資源管理。

 ● 資源是指在程序用完了之后必須要關(guān)閉的對象。

 ● try-with-resources保證了每個聲明了的資源在語句結(jié)束的時候會被關(guān)閉

 ● 什么樣的對象才能當(dāng)做資源使用呢?只要實現(xiàn)了java.lang.AutoCloseable接口或者java.io.Closeable接口的對象,都OK。

try-with-resources出現(xiàn)之前

try{	
    //open resources like File, Database connection, Sockets etc	
} catch (FileNotFoundException e) {	
    // Exception handling like FileNotFoundException, IOException etc	
}finally{	
    // close resources	
}

Java7, try-with-resources出現(xiàn)之后,使用資源實現(xiàn)

try(// open resources here){	
    // use resources	
} catch (FileNotFoundException e) {	
    // exception handling	
}	
// resources are closed as soon as try-catch block is executed.

Java7使用資源demo

public class Java7TryResourceTest {	
    public static void main(String[] args) {	
        try (BufferedReader br = new BufferedReader(new FileReader(	
                "C:/jaywei.txt"))) {	
            System.out.println(br.readLine());	
        } catch (IOException e) {	
            e.printStackTrace();	
        }	
    }	
}

使用了 try-with-resources的好處

 ● 代碼更加優(yōu)雅,行數(shù)更少。

 ● 資源自動管理,不用擔(dān)心內(nèi)存泄漏問題。

八、異常鏈

我們常常會想要在捕獲一個異常后拋出另一個異常,并且希望把原始異常的信息保存下來,這被稱為異常鏈

throw 拋出的是一個新的異常信息,這樣會導(dǎo)致原有的異常信息丟失。在JDk1.4以前,程序員必須自己編寫代碼來保存原始異常信息。現(xiàn)在所有 Throwable 子類在構(gòu)造器中都可以接受一個 cause(異常因由) 對象作為參數(shù)。

這個 cause就用來表示原始異常,這樣通過把原始異常傳遞給新的異常,使得即使當(dāng)前位置創(chuàng)建并拋出了新的異常,也能通過這個異常鏈追蹤到異常最初發(fā)生的位置。

使用方式如下:

public class TestChainException {	
    public void readFile() throws MyException{	
        try {	
            InputStream is = new FileInputStream("jay.txt");	
            Scanner in = new Scanner(is);	
            while (in.hasNext()) {	
                System.out.println(in.next());	
            }	
        } catch (FileNotFoundException e) {	
            //e 保存異常信息	
            throw new MyException("文件在哪里呢", e);	
        }	
    }	
    public void invokeReadFile() throws MyException{	
        try {	
            readFile();	
        } catch (MyException e) {	
            //e 保存異常信息	
            throw new MyException("文件找不到", e);	
        }	
    }	
    public static void main(String[] args) {	
        TestChainException t = new TestChainException();	
        try {	
            t.invokeReadFile();	
        } catch (MyException e) {	
            e.printStackTrace();	
        }	
    }	
}	
//MyException 構(gòu)造器	
public MyException(String message, Throwable cause) {	
        super(message, cause);	
    }

運行結(jié)果:

我們可以看到異常信息有保存下來的,如果把cause(也就是FileNotFoundException 的e)去掉呢,看一下運行結(jié)果:

可以發(fā)現(xiàn),少了 Throwablecause,原始異常信息不翼而飛了。

九、異常匹配

拋出異常的時候,異常處理系統(tǒng)會按照代碼的書寫順序找出"最近"的處理程序。找到匹配的處理程序之后,它就認(rèn)為異常將得到處理,然后就不再繼續(xù)查找。

查找的時候并不要求拋出的異常同處理程序的異常完全匹配。派生類的對象也可以配備其基類的處理程序

看demo

package exceptions;	
//: exceptions/Human.java	
// Catching exception hierarchies.	
class Annoyance extends Exception {}	
class Sneeze extends Annoyance {}	
public class Human {	
  public static void main(String[] args) {	
    // Catch the exact type:	
    try {	
      throw new Sneeze();	
    } catch(Sneeze s) {	
      System.out.println("Caught Sneeze");	
    } catch(Annoyance a) {	
      System.out.println("Caught Annoyance");	
    }	
    // Catch the base type:	
    try {	
      throw new Sneeze();	
    } catch(Annoyance a) {	
      System.out.println("Caught Annoyance");	
    }	
  }	
}

運行結(jié)果:

catch(Annoyance a)會捕獲Annoyance以及所有從它派生的異常。捕獲基類的異常,就可以匹配所有派生類的異常

try {	
      throw new Sneeze();	
    } catch(Annoyance a) {	
    } catch(Sneeze s) { //這句編譯器會報錯,因為異常已由前面catch子句處理	
    }

十、Java常見異常

NullPointerException

空指針異常,最常見的一個異常類。簡言之,調(diào)用了未經(jīng)初始化的對象或者是不存在的對象,就會產(chǎn)生該異常。

ArithmeticException

算術(shù)異常類,程序中出現(xiàn)了除數(shù)為0這樣的運算,就會出現(xiàn)這樣的異常。

ClassCastException

類型強(qiáng)制轉(zhuǎn)換異常,它是JVM在檢測到兩個類型間轉(zhuǎn)換不兼容時引發(fā)的運行時異常。

ArrayIndexOutOfBoundsException

數(shù)組下標(biāo)越界異常,跟數(shù)組打交道時,需要注意一下這個異常。

FileNotFoundException

文件未找到異常,一般是要讀或者寫的文件,找不到,導(dǎo)致該異常。

SQLException

操作數(shù)據(jù)庫異常,它是Checked Exception(檢查異常);

IOException

IO異常,一般跟讀寫文件息息相關(guān),它也是Checked Exception(檢查異常)。平時讀寫文件,記得IO流關(guān)閉!

NoSuchMethodException

方法未找到異常

NumberFormatException

字符串轉(zhuǎn)換為數(shù)字異常

總結(jié)

這個總結(jié)獨辟蹊徑,以幾道經(jīng)典異常面試題結(jié)束吧,以幫助大家復(fù)習(xí)一下,嘻嘻。

 ● java 異常有哪幾種,特點是什么?(知識點二可答)

 ● 什么是Java中的異常?(知識點一可答)

 ● error和exception有什么區(qū)別?(知識點二可答)

 ● 什么是異常鏈?(知識點八可答)

 ● try-catch-finally-return執(zhí)行順序(知識點四可答)

 ● 列出常見的幾種RunException (知識點二可答)

 ● Java異常類的重要方法是什么?(知識點五可答)

 ● error和exception的區(qū)別,CheckedException,RuntimeException的區(qū)別。(知識點二可答)

 ● 請列出5個運行時異常。(知識點二可答)

 ● Java 7 新的 try-with-resources 語句(知識點七可答)

 ● 怎么自定義異常?(知識點六可答)

 ● 說一下常見異常以及產(chǎn)生原因(知識點十可答)

 ● 談?wù)劗惓Fヅ洌ㄖR點九可答)

 ● 談?wù)劗惓L幚恚ㄖR點三可答)

本文來自?java入門?欄目,歡迎學(xué)習(xí)!

以上是10個Java異常的關(guān)鍵知識點的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在Java的地圖上迭代? 如何在Java的地圖上迭代? Jul 13, 2025 am 02:54 AM

遍歷Java中的Map有三種常用方法:1.使用entrySet同時獲取鍵和值,適用於大多數(shù)場景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡化代碼結(jié)構(gòu)。 entrySet返回包含所有鍵值對的Set集合,每次循環(huán)獲取Map.Entry對象,適合頻繁訪問鍵和值的情況;若只需鍵或值,可分別調(diào)用keySet()或values(),也可在遍歷鍵時通過map.get(key)獲取值;Java8中可通過Lambda表達(dá)式使用forEach((key,value)-&gt

Java中的可比較與比較器 Java中的可比較與比較器 Jul 13, 2025 am 02:31 AM

在Java中,Comparable用於類內(nèi)部定義默認(rèn)排序規(guī)則,Comparator用於外部靈活定義多種排序邏輯。 1.Comparable是類自身實現(xiàn)的接口,通過重寫compareTo()方法定義自然順序,適用於類有固定、最常用的排序方式,如String或Integer。 2.Comparator是外部定義的函數(shù)式接口,通過compare()方法實現(xiàn),適合同一類需要多種排序方式、無法修改類源碼或排序邏輯經(jīng)常變化的情況。兩者區(qū)別在於Comparable只能定義一種排序邏輯且需修改類本身,而Compar

如何處理Java中的字符編碼問題? 如何處理Java中的字符編碼問題? Jul 13, 2025 am 02:46 AM

處理Java中的字符編碼問題,關(guān)鍵是在每一步都明確指定使用的編碼。 1.讀寫文本時始終指定編碼,使用InputStreamReader和OutputStreamWriter並傳入明確的字符集,避免依賴系統(tǒng)默認(rèn)編碼。 2.在網(wǎng)絡(luò)邊界處理字符串時確保兩端一致,設(shè)置正確的Content-Type頭並用庫顯式指定編碼。 3.謹(jǐn)慎使用String.getBytes()和newString(byte[]),應(yīng)始終手動指定StandardCharsets.UTF_8以避免平臺差異導(dǎo)致的數(shù)據(jù)損壞??傊ㄟ^在每個階段

Hashmap在Java內(nèi)部如何工作? Hashmap在Java內(nèi)部如何工作? Jul 15, 2025 am 03:10 AM

HashMap在Java中通過哈希表實現(xiàn)鍵值對存儲,其核心在於快速定位數(shù)據(jù)位置。 1.首先使用鍵的hashCode()方法生成哈希值,並通過位運算轉(zhuǎn)換為數(shù)組索引;2.不同對象可能產(chǎn)生相同哈希值,導(dǎo)致衝突,此時以鍊錶形式掛載節(jié)點,JDK8後鍊錶過長(默認(rèn)長度8)則轉(zhuǎn)為紅黑樹提升效率;3.使用自定義類作鍵時必須重寫equals()和hashCode()方法;4.HashMap動態(tài)擴(kuò)容,當(dāng)元素數(shù)超過容量乘以負(fù)載因子(默認(rèn)0.75)時,擴(kuò)容並重新哈希;5.HashMap非線程安全,多線程下應(yīng)使用Concu

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時復(fù)制副本,因此互不影響;引用類型如對象、數(shù)組和函數(shù)存儲的是內(nèi)存地址,指向同一對象的變量會相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問題。理解這兩類差異有助於編寫更穩(wěn)定可靠的代碼。

Java中的'靜態(tài)”關(guān)鍵字是什麼? Java中的'靜態(tài)”關(guān)鍵字是什麼? Jul 13, 2025 am 02:51 AM

InJava,thestatickeywordmeansamemberbelongstotheclassitself,nottoinstances.Staticvariablesaresharedacrossallinstancesandaccessedwithoutobjectcreation,usefulforglobaltrackingorconstants.Staticmethodsoperateattheclasslevel,cannotaccessnon-staticmembers,

在C中使用std :: Chrono 在C中使用std :: Chrono Jul 15, 2025 am 01:30 AM

std::chrono在C 中用於處理時間,包括獲取當(dāng)前時間、測量執(zhí)行時間、操作時間點與持續(xù)時間及格式化解析時間。 1.獲取當(dāng)前時間使用std::chrono::system_clock::now(),可轉(zhuǎn)換為可讀字符串但係統(tǒng)時鐘可能不單調(diào);2.測量執(zhí)行時間應(yīng)使用std::chrono::steady_clock以確保單調(diào)性,並通過duration_cast轉(zhuǎn)換為毫秒、秒等單位;3.時間點(time_point)和持續(xù)時間(duration)可相互操作,但需注意單位兼容性和時鐘紀(jì)元(epoch)

什麼是Java的重新進(jìn)入? 什麼是Java的重新進(jìn)入? Jul 13, 2025 am 02:14 AM

ReentrantLock在Java中提供比synchronized更靈活的線程控制。 1.它支持非阻塞獲取鎖(tryLock())、帶超時的鎖獲取(tryLock(longtimeout,TimeUnitunit))和可中斷等待鎖;2.允許設(shè)置公平鎖,避免線程飢餓;3.支持多個條件變量,實現(xiàn)更精細(xì)的等待/通知機(jī)制;4.需手動釋放鎖,必須在finally塊中調(diào)用unlock()以避免資源洩漏;5.適用於需要高級同步控制的場景,如自定義同步工具或複雜並發(fā)結(jié)構(gòu),但對簡單互斥需求仍推薦使用synchro

See all articles