日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java程序员必备:异常的十个关键知识点

發(fā)布時間:2025/3/16 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java程序员必备:异常的十个关键知识点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

總結(jié)了Java異常十個關(guān)鍵知識點,面試或者工作中都有用哦,加油。

一. 異常是什么

異常是指阻止當(dāng)前方法或作用域繼續(xù)執(zhí)行的問題。比如你讀取的文件不存在,數(shù)組越界,進(jìn)行除法時,除數(shù)為0等都會導(dǎo)致異常。

一個文件找不到的異常

  • 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)錯誤,如虛擬機相關(guān)的錯誤,OutOfMemoryError等,error是無法處理的。

    Exception

    代碼異常,Java程序員關(guān)心的基類型通常是Exception。它能被程序本身可以處理,這也是它跟Error的區(qū)別。

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

    常見的RuntimeException異常:

  • - NullPointerException 空指針異常

  • - ArithmeticException 出現(xiàn)異常的運算條件時,拋出此異常

  • - IndexOutOfBoundsException 數(shù)組索引越界異常

  • - ClassNotFoundException 找不到類異常

  • - IllegalArgumentException(非法參數(shù)異常)

  • 常見的 Checked Exception 異常:

  • - IOException (操作輸入流和輸出流時可能出現(xiàn)的異常)

  • - ClassCastException(類型轉(zhuǎn)換異常類)

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

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

    三、異常處理

    當(dāng)異常出現(xiàn)后,會在堆上創(chuàng)建異常對象。當(dāng)前的執(zhí)行路徑被終止,并且從當(dāng)前環(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)鍵字表明,該方法不處理異常,而是把異常留給它的調(diào)用者處理。是不是覺得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了。

    看一個例子

  • 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變?yōu)?,這個值被保存起來。

    • 因為沒有發(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以前,程序員必須自己編寫代碼來保存原始異常信息?,F(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

    類型強制轉(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ヅ?#xff08;知識點九可答)

    • 談?wù)劗惓L幚?#xff08;知識點三可答)

    有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

    歡迎大家關(guān)注Java之道公眾號

    好文章,我在看??

    總結(jié)

    以上是生活随笔為你收集整理的Java程序员必备:异常的十个关键知识点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。