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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

java

java怎么碰到异常跳过继续执行_Java异常处理很难吗?BAT大厂的架构师是怎么处理Java异常的?...

發(fā)布時(shí)間:2025/3/12 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java怎么碰到异常跳过继续执行_Java异常处理很难吗?BAT大厂的架构师是怎么处理Java异常的?... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎關(guān)注專(zhuān)欄《Java架構(gòu)筑基》——專(zhuān)注于Java技術(shù)的研究與分享!

Java架構(gòu)筑基?zhuanlan.zhihu.com
  • Java架構(gòu)筑基——專(zhuān)注于Java技術(shù)的研究與分享!
  • 后續(xù)文章將首發(fā)此專(zhuān)欄!
  • 歡迎各位Java工程師朋友投稿和關(guān)注
  • # 鏈接 Java程序員福利"常用資料分享"

異常是運(yùn)行時(shí)在代碼序列中引起的非正常狀態(tài)。在不支持異常處理的計(jì)算機(jī)語(yǔ)言中,必須手動(dòng)檢查和處理錯(cuò)誤,Java語(yǔ)言則采用面向?qū)ο蟮姆绞焦芾磉\(yùn)行時(shí)錯(cuò)誤

一、基礎(chǔ)知識(shí)

Java異常是用來(lái)描述在一段代碼中發(fā)生的異常情況的對(duì)象。當(dāng)出現(xiàn)引起異常的情況時(shí),就會(huì)創(chuàng)建用來(lái)表示異常的對(duì)象,并在引起異常的方法中拋出異常對(duì)象。方法可以選擇自己處理異常或者傳遞異常交由其他方法來(lái)處理

Java異常處理通過(guò)五個(gè)關(guān)鍵字進(jìn)行管理:try、catch、throw、throws、finally

在try代碼快中封裝可能發(fā)生異常的程序語(yǔ)句,對(duì)這些語(yǔ)句進(jìn)行監(jiān)視。如果在try代碼塊中發(fā)生異常,就會(huì)將異常拋出。代碼使用catch來(lái)捕獲異常,并可以定義一些方法來(lái)處理異常。系統(tǒng)生成的異常由Java運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出。為了手動(dòng)拋出異常,需要使用throw關(guān)鍵字。從方法中拋出的任何異常都必須通過(guò)一條throws子句進(jìn)行指定。在try代碼塊結(jié)束之后必須執(zhí)行的所有代碼則需要放在finally代碼塊中

二、異常類(lèi)型

所有異常類(lèi)型都是內(nèi)置類(lèi)Throwable的子類(lèi),Throwable的兩個(gè)子類(lèi)將異常分為兩個(gè)不同的分支。一個(gè)分支是Exception類(lèi),這個(gè)類(lèi)既可以用于用戶(hù)程序當(dāng)前捕獲的異常情況,也可以用于創(chuàng)建自定義異常類(lèi)型的子類(lèi)。另一個(gè)分支是Error類(lèi),該類(lèi)定義了在常規(guī)環(huán)境下不希望由程序捕獲的異常。Error類(lèi)型的異常由Java運(yùn)行時(shí)系統(tǒng)使用,以指示運(yùn)行時(shí)系統(tǒng)本身發(fā)生了某些錯(cuò)誤

三、未捕獲的異常

沒(méi)有被程序捕獲的所有異常,最終都會(huì)交由Java運(yùn)行時(shí)系統(tǒng)提供的默認(rèn)處理程序捕獲。默認(rèn)處理程序會(huì)顯示一個(gè)描述異常的字符串,輸出異常發(fā)生的堆棧蹤跡并終止程序

例如,運(yùn)行如下代碼:

public class Demo {public static void main(String[] args) {int a=2/0;}}

生成的異常信息:

Exception in thread "main" java.lang.ArithmeticException: / by zeroat Demo.main(Demo.java:5)

拋出的異常的類(lèi)型是Exception的子類(lèi)ArithmeticException,即算術(shù)異常,更具體地描述了發(fā)生的錯(cuò)誤類(lèi)型。Java提供了一些能與可能產(chǎn)生的各種運(yùn)行時(shí)錯(cuò)誤相匹配的內(nèi)置異常類(lèi)型

四、使用try和catch

進(jìn)行主動(dòng)的異常處理有兩個(gè)優(yōu)點(diǎn):第一,語(yǔ)序允許修復(fù)錯(cuò)誤;第二,阻止程序自動(dòng)終止

為了主動(dòng)處理運(yùn)行時(shí)錯(cuò)誤,可以在try代碼塊中封裝希望監(jiān)視的代碼,之后通過(guò)catch子句指定希望捕獲的異常類(lèi)型。 例如,參照如下代碼:

public static void main(String[] args) {try{int a=10/0;System.out.println("輸出語(yǔ)句1");}catch(ArithmeticException e){System.out.println("輸出語(yǔ)句2");}System.out.println("輸出語(yǔ)句3");}

輸出結(jié)果是:

輸出語(yǔ)句2輸出語(yǔ)句3

代碼在進(jìn)行除零操作時(shí)發(fā)生了異常,此時(shí)“輸出語(yǔ)句1”將無(wú)法得到被調(diào)用的機(jī)會(huì)。一旦拋出異常,程序控制就會(huì)從try代碼塊中轉(zhuǎn)移出來(lái),進(jìn)入catch代碼塊中。執(zhí)行了catch語(yǔ)句后,就會(huì)繼續(xù)運(yùn)行整個(gè)try/catch代碼塊的下一行

五、多條catch子句

在有些情況下,一個(gè)代碼塊可能會(huì)引發(fā)多個(gè)異常。對(duì)于這種情況,需要指定兩條或多條catch子句,用于捕獲不同類(lèi)型的異常。當(dāng)拋出異常時(shí),按順序檢查每條catch語(yǔ)句,執(zhí)行類(lèi)型和異常相匹配的第一條catch子句,忽略其他catch子句,并繼續(xù)執(zhí)行try/catch代碼塊后面的代碼

需要注意的是,異常子類(lèi)必須位于異常超類(lèi)之前,因?yàn)槭褂昧四硞€(gè)超類(lèi)的catch語(yǔ)句會(huì)捕獲這個(gè)超類(lèi)及其所有子類(lèi)的異常。因此,如果子類(lèi)位于超類(lèi)之后的話(huà),永遠(yuǎn)也不會(huì)到達(dá)子類(lèi)。不可到達(dá)的代碼會(huì)被編譯器提示錯(cuò)誤

參照如下代碼,通過(guò)Math的靜態(tài)方法random來(lái)隨機(jī)產(chǎn)生0和1兩個(gè)隨機(jī)數(shù),生成的不同數(shù)值就會(huì)引發(fā)不同的異常,分別由不同的catch子句進(jìn)行處理

public static void main(String[] args) { int random=(int) Math.round(Math.random());try{int a=10/random;int[] array={10};array[random]=1;}catch (ArithmeticException e) {System.out.println("ArithmeticException");}catch (ArrayIndexOutOfBoundsException e) {System.out.println("ArrayIndexOutOfBoundsException");}System.out.println("代碼塊結(jié)束");}

此外,也可以通過(guò)多重捕獲的方式來(lái)使用相同的catch子句捕獲兩個(gè)或更多個(gè)異常。在catch子句中使用或運(yùn)算符(|)分隔每個(gè)異常,每個(gè)多重捕獲參數(shù)都被隱式地聲明為final類(lèi)型

public static void main(String[] args) { int random=(int) Math.round(Math.random());try{int a=10/random;int[] array={10};array[random]=1;}catch(ArithmeticException | ArrayIndexOutOfBoundsException e){System.out.println("兩個(gè)異常之一");}}

六、throw

在之前的例子中,捕獲的異常都是由Java運(yùn)行時(shí)系統(tǒng)拋出的異常,可以通過(guò)throw語(yǔ)句顯式地拋出異常

throw的一般形式如下所示:

throw ThrowableInstance

ThrowableInstance必須是Throwable或其子類(lèi)類(lèi)型的對(duì)象。throw語(yǔ)句之后的執(zhí)行流程會(huì)立即停止,所有的后續(xù)語(yǔ)句都不會(huì)執(zhí)行,然后按順序依次檢查所有的catch語(yǔ)句,檢查是否和異常類(lèi)型相匹配。如果沒(méi)有找到匹配的catch語(yǔ)句,那么默認(rèn)的異常處理程序會(huì)終止程序并輸出堆棧蹤跡

例如,運(yùn)行以下代碼,將得到輸出結(jié)果:“NullPointerException”

public class Demo {public static void demo(){throw new NullPointerException("NullPointer");}public static void main(String[] args) {try{demo();}catch (NullPointerException e) {System.out.println("NullPointerException");}}}

但如果catch子句的異常與throw拋出的異常類(lèi)型不匹配時(shí),異常將由Java默認(rèn)的異常處理程序來(lái)處理

例如,運(yùn)行以下代碼:

public class Demo {public static void demo(){throw new NullPointerException("NullPointer");}public static void main(String[] args) {try{demo();}catch (ArrayIndexOutOfBoundsException e) {System.out.println("ArrayIndexOutOfBoundsException");}}}

運(yùn)行結(jié)果是:

Exception in thread "main" java.lang.NullPointerException: NullPointerat Demo.demo(Demo.java:4)at Demo.main(Demo.java:9)

七、throws

如果方法可能引發(fā)自身不進(jìn)行處理的異常,就必須通過(guò)throws關(guān)鍵字來(lái)向方法的調(diào)用者指明要拋出的異常類(lèi)型。 方法可能拋出的所有異常都必須在throws子句中進(jìn)行聲明,否則將產(chǎn)生編譯時(shí)錯(cuò)誤

例如,參照以下代碼,該程序試圖拋出無(wú)法匹配的異常,因?yàn)槌绦驔](méi)有指定throws子句來(lái)聲明這一事實(shí),所以程序無(wú)法編譯

public class Demo {public static void demo(){throw new IllegalAccessException("IllegalAccess");}public static void main(String[] args) {demo();}}

為了使代碼能夠運(yùn)行,需要將之進(jìn)行如下修改

public class Demo {public static void demo() throws IllegalAccessException{throw new IllegalAccessException("IllegalAccess");}public static void main(String[] args) {try {demo();} catch (IllegalAccessException e) {System.out.println(e.getMessage());}}}

八、finally

當(dāng)拋出異常后,方法的執(zhí)行流程將不會(huì)按照原先的順序進(jìn)行,這對(duì)于某些方法來(lái)說(shuō)是個(gè)問(wèn)題。例如,如果在方法中打開(kāi)了一個(gè)文件,我們并不希望因?yàn)閽伋隽水惓?dǎo)致關(guān)閉文件的代碼被跳過(guò)而不執(zhí)行。finally關(guān)鍵字就是來(lái)解決這種情況的。 使用finally可以創(chuàng)建一個(gè)代碼塊,該代碼塊會(huì)在執(zhí)行try/catch代碼塊之后執(zhí)行,且在執(zhí)行try/catch代碼塊后面的代碼之前執(zhí)行。不管是否有異常拋出,都將執(zhí)行finally代碼塊

只要方法從try/catch代碼塊內(nèi)部返回到調(diào)用者,不管是通過(guò)未捕獲的異常還是使用顯式的返回語(yǔ)句,都會(huì)在方法返回之前執(zhí)行finally子句

例如,如下的輸出結(jié)果將是:2

public class Demo {public static int demo(){try{int a=10/0;System.out.println(a);}catch(Exception e){return 1;}finally {return 2;}}public static void main(String[] args) {System.out.println(demo());}}

九、鏈?zhǔn)疆惓?/h2>

鏈?zhǔn)疆惓S糜跒楫惓jP(guān)聯(lián)另一個(gè)異常,第二個(gè)異常用于描述當(dāng)前異常產(chǎn)生的原因。例如,某個(gè)方法從文件讀取數(shù)值來(lái)作為除法運(yùn)算的除數(shù),由于發(fā)生了I/O錯(cuò)誤導(dǎo)致獲取到的數(shù)值是0,從而導(dǎo)致了ArithmeticException異常

如果想要讓代碼調(diào)用者知道背后的原因是I/O錯(cuò)誤,使用鏈?zhǔn)疆惓>涂梢詠?lái)處理這種情況以及其他存在多層異常的情況

為了使用鏈?zhǔn)疆惓?#xff0c;Throwable有兩個(gè)構(gòu)造函數(shù)和兩個(gè)方法用于處理這種情況

兩個(gè)構(gòu)造函數(shù):

Throwable(Throwable cause)Throwable(String message, Throwable cause)

cause即是用于指定引發(fā)當(dāng)前異常的背后原因,message則可以用于同時(shí)指定異常描述

兩個(gè)方法:

Throwable getCause()Throwable initCause(Throwable cause)

getCause() 方法用來(lái)返回引發(fā)當(dāng)前異常的異常,如果不存在背后異常則返回null

initCause(Throwable cause) 方法將cause和明面上的異常關(guān)聯(lián)到一起,并返回對(duì)異常的引用。因此可以在創(chuàng)建異常之后將異常和背后異常關(guān)聯(lián)到一起。但是,背后異常只能設(shè)置一次,即initCause(Throwable cause) 方法只能調(diào)用一次。此外,如果通過(guò)構(gòu)造函數(shù)設(shè)置了背后異常,也不能再使用該方法來(lái)設(shè)置背后異常了

例如,參照如下代碼:

public class Demo {public static void demo(){NullPointerException nullPointerException=new NullPointerException("nullPointer");nullPointerException.initCause(new ArithmeticException("Arithmetic"));throw nullPointerException;}public static void main(String[] args) {try {demo();} catch (Exception e) {System.out.println(e.getMessage());System.out.println(e.getCause().getMessage());}}}

運(yùn)行結(jié)果是:

nullPointer Arithmetic

鏈?zhǔn)疆惓?梢园枰娜我馍疃?#xff0c;但是,過(guò)長(zhǎng)的異常鏈可能是一種不良的設(shè)計(jì)

# 鏈接 Java程序員福利"常用資料分享"

總結(jié)

以上是生活随笔為你收集整理的java怎么碰到异常跳过继续执行_Java异常处理很难吗?BAT大厂的架构师是怎么处理Java异常的?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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