在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JAVA中常見的幾個(gè)異常類型及處理方案

454398 ? 來源:阿里云 ? 作者:阿里云原創(chuàng) ? 2020-10-15 16:36 ? 次閱讀

異常簡介

先上個(gè)圖,看一下常見的幾個(gè)異常類型。

所有的異常都來自于Throwable。Throwable有兩個(gè)子類,Error和Exception。

Error通常表示的是嚴(yán)重錯(cuò)誤,這些錯(cuò)誤是不建議被catch的。

注意這里有一個(gè)例外,比如ThreadDeath也是繼承自Error,但是它表示的是線程的死亡,雖然不是嚴(yán)重的異常,但是因?yàn)閼?yīng)用程序通常不會(huì)對(duì)這種異常進(jìn)行catch,所以也歸類到Error中。

Exception表示的是應(yīng)用程序希望catch住的異常。

在Exception中有一個(gè)很特別的異常叫做RuntimeException。RuntimeException叫做運(yùn)行時(shí)異常,是不需要被顯示catch住的,所以也叫做unchecked Exception。而其他非RuntimeException的Exception則需要顯示try catch,所以也叫做checked Exception。

不要忽略checked exceptions

我們知道checked exceptions是一定要被捕獲的異常,我們?cè)诓东@異常之后通常有兩種處理方式。

第一種就是按照業(yè)務(wù)邏輯處理異常,第二種就是本身并不處理異常,但是將異常再次拋出,由上層代碼來處理。

如果捕獲了,但是不處理,那么就是忽略checked exceptions。

接下來我們來考慮一下java中線程的中斷異常。

java中有三個(gè)非常相似的方法interrupt,interrupted和isInterrupted。

isInterrupted()只會(huì)判斷是否被中斷,而不會(huì)清除中斷狀態(tài)。

interrupted()是一個(gè)類方法,調(diào)用isInterrupted(true)判斷的是當(dāng)前線程是否被中斷。并且會(huì)清除中斷狀態(tài)。

前面兩個(gè)是判斷是否中斷的方法,而interrupt()就是真正觸發(fā)中斷的方法。

它的工作要點(diǎn)有下面4點(diǎn):

如果當(dāng)前線程實(shí)例在調(diào)用Object類的wait(),wait(long)或wait(long,int)方法或join(),join(long),join(long,int)方法,或者在該實(shí)例中調(diào)用了Thread.sleep(long)或Thread.sleep(long,int)方法,并且正在阻塞狀態(tài)中時(shí),則其中斷狀態(tài)將被清除,并將收到InterruptedException。

如果此線程在InterruptibleChannel上的I / O操作中處于被阻塞狀態(tài),則該channel將被關(guān)閉,該線程的中斷狀態(tài)將被設(shè)置為true,并且該線程將收到j(luò)ava.nio.channels.ClosedByInterruptException異常。

如果此線程在java.nio.channels.Selector中處于被被阻塞狀態(tài),則將設(shè)置該線程的中斷狀態(tài)為true,并且它將立即從select操作中返回。

如果上面的情況都不成立,則設(shè)置中斷狀態(tài)為true。

看下面的例子:

public void wrongInterrupted(){

try{

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

上面代碼中我們捕獲了一個(gè)InterruptedException,但是我們僅僅是打印出了異常信息,并沒有做任何操作。這樣程序的表現(xiàn)和沒有發(fā)送一異常一樣,很明顯是有問題的。

根據(jù)上面的介紹,我們知道,interrupted()方法會(huì)清除中斷狀態(tài),所以,如果我們自身處理不了異常的情況下,需要重新調(diào)用Thread.currentThread().interrupt()重新拋出中斷,由上層代碼負(fù)責(zé)處理,如下所示。

public void correctInterrupted(){

try{

Thread.sleep(1000);

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

}

}

不要在異常中暴露敏感信息

遇到異常的時(shí)候,通常我們需要進(jìn)行一定程度的日志輸出,從而來定位異常。但是我們?cè)谧鋈罩据敵龅臅r(shí)候,一定要注意不要暴露敏感信息。

下表可以看到異常信息可能會(huì)暴露的敏感信息:

除了敏感信息之外,我們還要做好日志信息的安全保護(hù)。

在處理捕獲的異常時(shí),需要恢復(fù)對(duì)象的初始狀態(tài)

如果我們?cè)谔幚懋惓5臅r(shí)候,修改了對(duì)象中某些字段的狀態(tài),在捕獲異常的時(shí)候需要怎么處理呢?

private int age=30;

public void wrongRestore(){

try{

age=20;

throw new IllegalStateException(“custom exception!”);

}catch (IllegalStateException e){

System.out.println(“we do nothing”);

}

}

上面的例子中,我們將age重置為20,然后拋出了異常。雖然拋出了異常,但是我們并沒有重置age,最后導(dǎo)致age最終被修改了。

整個(gè)restore的邏輯沒有處理完畢,但是我們部分修改了對(duì)象的數(shù)據(jù),這是很危險(xiǎn)的。

實(shí)際上,我們需要一個(gè)重置:

public void rightRestore(){

try{

age=20;

throw new IllegalStateException(“custom exception!”);

}catch (IllegalStateException e){

System.out.println(“we do nothing”);

age=30;

}

}

不要手動(dòng)完成finally block

我們?cè)谑褂胻ry-finally和try-catch-finally語句時(shí),一定不要在finally block中使用return, break, continue或者throw語句。

為什么呢?

根據(jù)Java Language Specification(JLS)的說明,finally block一定會(huì)被執(zhí)行,不管try語句中是否拋出異常。

在try-finally和try-catch-finally語句中,如果try語句中拋出了異常R,然后finally block被執(zhí)行,這時(shí)候有兩種情況:

如果finally block正常執(zhí)行,那么try語句被終止的原因是異常R。

如果在finally block中拋出了異常S,那么try語句被終止的原因?qū)?huì)變成S。

我們舉個(gè)例子:

public class FinallyUsage {

public boolean wrongFinally(){

try{

throw new IllegalStateException(“my exception!”);

}finally {

System.out.println(“Code comes to here!”);

return true;

}

}

public boolean rightFinally(){

try{

throw new IllegalStateException(“my exception!”);

}finally {

System.out.println(“Code comes to here!”);

}

}

public static void main(String[] args) {

FinallyUsage finallyUsage=new FinallyUsage();

finallyUsage.wrongFinally();

finallyUsage.rightFinally();

}

}

上面的例子中,我們定義了兩個(gè)方法,一個(gè)方法中我們?cè)趂inally中直接return,另一方法中,我們讓finally正常執(zhí)行完畢。

最終,我們可以看到wrongFinally將異常隱藏了,而rightFinally保留了try的異常。

同樣的,如果我們?cè)趂inally block中拋出了異常,我們一定要記得對(duì)其進(jìn)行捕獲,否則將會(huì)隱藏try block中的異常信息。

不要捕獲NullPointerException和它的父類異常

通常來說NullPointerException表示程序代碼有邏輯錯(cuò)誤,是需要程序員來進(jìn)行代碼邏輯修改,從而進(jìn)行修復(fù)的。

比如說加上一個(gè)null check。

不捕獲NullPointerException的原因有三個(gè)。

使用null check的開銷要遠(yuǎn)遠(yuǎn)小于異常捕獲的開銷。

如果在try block中有多個(gè)可能拋出NullPointerException的語句,我們很難定位到具體的錯(cuò)誤語句。

最后,如果發(fā)生了NullPointerException,程序基本上不可能正常運(yùn)行或者恢復(fù),所以我們需要提前進(jìn)行null check的判斷。

同樣的,程序也不要對(duì)NullPointerException的父類RuntimeException, Exception, or Throwable進(jìn)行捕捉。

不要throw RuntimeException, Exception, or Throwable

我們拋出異常主要是為了能夠找到準(zhǔn)確的處理異常的方法,如果直接拋出RuntimeException, Exception, 或者 Throwable就會(huì)導(dǎo)致程序無法準(zhǔn)確處理特定的異常。

通常來說我們需要自定義RuntimeException, Exception, 或者 Throwable的子類,通過具體的子類來區(qū)分具體的異常類型。

不要拋出未聲明的checked Exception

一般來說checked Exception是需要顯示catch住,或者在調(diào)用方法上使用throws做申明的。

但是我們可以通過某些手段來繞過這種限制,從而在使用checked Exception的時(shí)候不需要遵守上述規(guī)則。

當(dāng)然這樣做是需要避免的。我們看一個(gè)例子:

private static Throwable throwable;

private ThrowException() throws Throwable {

throw throwable;

}

public static synchronized void undeclaredThrow(Throwable throwable) {

ThrowException.throwable = throwable;

try {

ThrowException.class.newInstance();

} catch (InstantiationException e) {

} catch (IllegalAccessException e) {

} finally {

ThrowException.throwable = null;

}

}

上面的例子中,我們定義了一個(gè)ThrowException的private構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)會(huì)throw一個(gè)throwable,這個(gè)throwable是從方法傳入的。

在undeclaredThrow方法中,我們調(diào)用了ThrowException.class.newInstance()實(shí)例化一個(gè)ThrowException實(shí)例,因?yàn)樾枰{(diào)用構(gòu)造函數(shù),所以會(huì)拋出傳入的throwable。

因?yàn)镋xception是throwable的子類,如果我們?cè)谡{(diào)用的時(shí)候傳入一個(gè)checked Exception,很明顯,我們的代碼并沒有對(duì)其進(jìn)行捕獲:

public static void main(String[] args) {

ThrowException.undeclaredThrow(

new Exception(“Any checked exception”));

}

怎么解決這個(gè)問題呢?換個(gè)思路,我們可以使用Constructor.newInstance()來替代class.newInstance()。

try {

Constructor constructor =

ThrowException.class.getConstructor(new Class《?》[0]);

constructor.newInstance();

} catch (InstantiationException e) {

} catch (InvocationTargetException e) {

System.out.println(“catch exception!”);

} catch (NoSuchMethodException e) {

} catch (IllegalAccessException e) {

} finally {

ThrowException.throwable = null;

}

上面的例子,我們使用Constructor的newInstance方法來創(chuàng)建對(duì)象的實(shí)例。和class.newInstance不同的是,這個(gè)方法會(huì)拋出InvocationTargetException異常,并且把所有的異常都封裝進(jìn)去。

所以,這次我們獲得了一個(gè)checked Exception。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2983

    瀏覽量

    106496
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20019
  • 異常
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    9319
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    射頻電路中常見的損耗類型

    射頻電路中的損耗是指在射頻信號(hào)傳輸、處理過程中,信號(hào)能量的減少。
    的頭像 發(fā)表于 03-17 11:29 ?431次閱讀

    射頻電路中常見的元器件封裝類型有哪些

    射頻電路中常見的元器件封裝類型有以下幾種: 表面貼裝技術(shù)(SMT)封裝 方型扁平式封裝(QFP/PFP):引腳間距小、管腳細(xì),適用于大規(guī)模或超大型集成電路,可降低寄生參數(shù),適合高頻應(yīng)用,外形尺寸
    的頭像 發(fā)表于 02-04 15:22 ?389次閱讀

    數(shù)字電路中常見組件

    數(shù)字電路是由一系列電子組件組成的,它們處理的是二進(jìn)制信號(hào),即電壓水平的高低,通常對(duì)應(yīng)于邏輯“0”和“1”。以下是數(shù)字電路中常見的一些組件,以及它們的基本功能和特點(diǎn): 邏輯門(Logic Gates
    的頭像 發(fā)表于 01-24 09:40 ?451次閱讀

    棱鏡——機(jī)器視覺系統(tǒng)中常見的重要配件

    棱鏡——機(jī)器視覺系統(tǒng)中常見的重要配件
    的頭像 發(fā)表于 01-15 17:36 ?388次閱讀
    棱鏡——機(jī)器視覺系統(tǒng)<b class='flag-5'>中常見</b>的重要配件

    串口通訊異常處理方法 串口設(shè)備連接方式

    串口通信異常處理方法 1. 異常檢測 在串口通信中,首先需要能夠檢測到異常情況。異常檢測可以通過以下幾種方式實(shí)現(xiàn): 硬件檢測 :利用串口硬件
    的頭像 發(fā)表于 12-27 09:53 ?3066次閱讀

    eda中常用的數(shù)據(jù)處理方法

    探索性數(shù)據(jù)分析(EDA)是一種統(tǒng)計(jì)方法,用于使用統(tǒng)計(jì)圖表、圖形和計(jì)算來發(fā)現(xiàn)數(shù)據(jù)中的模式、趨勢和異常值。在進(jìn)行EDA時(shí),數(shù)據(jù)處理是至關(guān)重要的,因?yàn)樗梢詭椭覀兏玫乩斫鈹?shù)據(jù)集,為進(jìn)一步的分析和建模
    的頭像 發(fā)表于 11-13 10:57 ?717次閱讀

    soc開發(fā)流程常見問題及解決方案

    SOC(System on a Chip,系統(tǒng)級(jí)芯片)開發(fā)流程中常見問題及解決方案主要包括以下幾個(gè)方面: 一、環(huán)境問題 常見問題 : 開發(fā)環(huán)境配置復(fù)雜,新手難以快速上手。 依賴項(xiàng)缺失或
    的頭像 發(fā)表于 11-10 09:26 ?1240次閱讀

    檢測系統(tǒng)中常見的信號(hào)類型有哪些

    在檢測系統(tǒng)中,常見的信號(hào)類型多種多樣,這些信號(hào)類型根據(jù)被測物理量的不同而有所區(qū)別。以下是一些常見的信號(hào)類型: 位移信號(hào) :位移信號(hào)是檢測系統(tǒng)
    的頭像 發(fā)表于 10-15 13:57 ?1281次閱讀

    放大電路中常見的噪聲有哪些

    在放大電路中,噪聲是一個(gè)不可忽視的問題,它會(huì)影響信號(hào)的純凈度和系統(tǒng)的性能。放大電路中的噪聲來源廣泛,包括電路元件本身、外部環(huán)境以及電路設(shè)計(jì)等多個(gè)方面。以下將詳細(xì)闡述放大電路中常見的噪聲類型,并探討其產(chǎn)生原因和特性。
    的頭像 發(fā)表于 09-03 14:03 ?2044次閱讀

    Panasonic松下焊接電異常處理

    電子發(fā)燒友網(wǎng)站提供《Panasonic松下焊接電異常處理.pdf》資料免費(fèi)下載
    發(fā)表于 08-19 14:24 ?0次下載

    嵌入式C編程常用的異常錯(cuò)誤處理

    嵌入式C編程中,異常錯(cuò)誤處理是確保系統(tǒng)穩(wěn)定性和可靠性的重要部分。以下是一些常見異常錯(cuò)誤處理方法及其詳細(xì)說明和示例: 1. 斷言 (Ass
    發(fā)表于 08-06 14:32

    嵌入式系統(tǒng)中常用的五種微處理類型

    本文介紹了嵌入式系統(tǒng)中常用的五種微處理類型:微處理器單元(MPU)、微控制器(MCU)、數(shù)字信號(hào)處理器(DSP)、現(xiàn)場可編程邏輯門陣列(F
    的頭像 發(fā)表于 07-25 09:29 ?2354次閱讀

    甲烷濃度檢測儀中常見的檢測技術(shù)及其應(yīng)用

    甲烷濃度檢測儀中常見的檢測技術(shù)及其應(yīng)用
    的頭像 發(fā)表于 07-08 10:47 ?983次閱讀
    甲烷濃度檢測儀<b class='flag-5'>中常見</b>的檢測技術(shù)及其應(yīng)用

    機(jī)器視覺中常用的光源類型及優(yōu)點(diǎn)?

    中常用的光源類型及其優(yōu)點(diǎn)。 一、LED光源 優(yōu)點(diǎn) (1)高亮度:LED光源具有高亮度,能夠提供足夠的光線,使圖像更加清晰。 (2)低能耗:LED光源的能耗較低,能夠降低整個(gè)系統(tǒng)的運(yùn)行成本。 (3)長壽命:LED光源的使用壽命較長,一
    的頭像 發(fā)表于 07-04 10:28 ?1063次閱讀

    一站式統(tǒng)一返回值封裝、異常處理異常錯(cuò)誤碼解決方案—最強(qiáng)的Sping Boot接口優(yōu)雅響應(yīng)處理

    處理的邏輯集中到一個(gè)地方,避免代碼中出現(xiàn)大量的try-catch語句,降低了代碼的復(fù)雜度,提高了代碼的可讀性;異常體系的設(shè)計(jì)可以清晰地區(qū)分不同類型異常,使得開發(fā)者能夠更加精準(zhǔn)地
    的頭像 發(fā)表于 06-20 15:42 ?811次閱讀
    主站蜘蛛池模板: 中文字幕第7页 | 你懂在线| 人人精品 | 一区二区三区在线播放 | 九九热国产 | 免费一级特黄特色大片在线观看看 | 国产午夜精品理论片在线 | 亚洲骚片 | 久久99热久久精品99 | 国产免费私拍一区二区三区 | 国产一区二区三区在线观看视频 | 欧美日韩性大片 | 国产精品国产主播在线观看 | 一区视频 | 四虎最新影院 | 在线免费看污视频 | 日本特黄特色免费大片 | 日本免费黄色网址 | 痴女在线播放免费视频 | 天天操天天射天天舔 | 欧美日韩色综合网站 | 一级久久久 | 国产视频观看 | 狠狠狠色丁香婷婷综合久久五月 | 国产自产视频在线观看香蕉 | 欧美一卡2卡三卡四卡五卡 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 我想看一级播放片一级的 | 奇米影视777欧美在线观看 | 色综合成人丁香 | 天天在线天天在线天天影视 | 高清欧美色欧美综合网站 | 狼人 成人 综合 亚洲 | 一本到视频在线 | 五月婷婷丁香在线视频 | a级精品九九九大片免费看 a级毛毛片看久久 | 午夜精品福利影院 | 最新欧美伦理网 | 亚洲色图图片 | 理论片亚洲 | www.91在线| 日本一区二区三区不卡在线视频 |