10.Java異常問(wèn)題

目錄介紹

  • 10.0.0.1 見過(guò)哪些運(yùn)行時(shí)異常?異常處理機(jī)制知道哪些?從異常是否必須需要被處理的角度來(lái)看怎么分類?
  • 10.0.0.2 運(yùn)用Java異常處理機(jī)制?異常處理的原理?Java中檢查異常和非檢查異常的區(qū)別?
  • 10.0.0.3 異常處理的過(guò)程中,你遵循那些好的實(shí)踐? throw 和 throws這兩個(gè)關(guān)鍵字在java中有什么不同?
  • 10.0.0.4 你知道什么是“異常鏈”嗎?自定義實(shí)現(xiàn)過(guò)哪些異常,怎么寫的?可以有一個(gè)空的catch塊嗎?
  • 10.0.0.5 Java異常類有哪些的重要方法?導(dǎo)致“主線程中的異常”的不同場(chǎng)景是什么?
  • 10.0.0.6 看下面這段子類繼承父類代碼有什么問(wèn)題?針對(duì)拋異常是IOException還是Exception,能隨便寫嗎,結(jié)合案例說(shuō)一下?
  • 10.0.0.7 捕獲異常時(shí),為何在catch中要注意異常層級(jí)關(guān)系?需要注意哪些問(wèn)題?

好消息

  • 博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識(shí)點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長(zhǎng)期更新維護(hù)并且修正,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客,從12年起,積累共計(jì)500篇[近100萬(wàn)字],將會(huì)陸續(xù)發(fā)表到網(wǎng)上,轉(zhuǎn)載請(qǐng)注明出處,謝謝!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬(wàn)事起于忽微,量變引起質(zhì)變!所有博客將陸續(xù)開源到GitHub!

10.0.0.1 見過(guò)哪些運(yùn)行時(shí)異常?異常處理機(jī)制知道哪些?從異常是否必須需要被處理的角度來(lái)看怎么分類?

  • 運(yùn)行時(shí)異常:Throwable繼承層次結(jié)構(gòu),可見分成兩大類Error和Exception:
    • Error(錯(cuò)誤):指程序無(wú)法恢復(fù)的異常情況,表示運(yùn)行應(yīng)用程序中較嚴(yán)重的問(wèn)題;發(fā)生于虛擬機(jī)自身、或者在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí),如Virtual MachineError(Java虛擬機(jī)運(yùn)行錯(cuò)誤)、NoClassDefFoundError(類定義錯(cuò)誤);屬于不可查異常,即不強(qiáng)制程序員必須處理,即使不處理也不會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。
    • Exception(異常):指程序有可能恢復(fù)的異常情況,表示程序本身可以處理的異常。又分兩大類:
      • RuntimeException(運(yùn)行時(shí)異常):由程序自身的問(wèn)題導(dǎo)致產(chǎn)生的異常;如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常);屬于不可查異常。
      • 非運(yùn)行時(shí)異常:由程序外部的問(wèn)題引起的異常;除了RuntimeException以外的異常,如FileNotFoundException(文件不存在異常);屬于可查異常,即強(qiáng)制程序員必須進(jìn)行處理,如果不進(jìn)行處理則會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。
  • 異常處理機(jī)制
    • 捕捉異常:由系統(tǒng)自動(dòng)拋出異常,即try捕獲異常->catch處理異常->finally 最終處理
    • 拋出異常:在方法中將異常對(duì)象顯性地拋出,之后異常會(huì)沿著調(diào)用層次向上拋出,交由調(diào)用它的方法來(lái)處理。配合throws聲明拋出的異常和throw拋出異常
    • 自定義異常:繼承Execption類或其子類
    • 技術(shù)博客大總結(jié)
  • 從異常是否必須需要被處理的角度來(lái)看怎么分類
    • 異常又可分為不受檢查異常和受檢查異常兩種情況:
      • 不受檢查異常:派生于 Error 或 RuntimeException 的所有異常;
      • 受檢查異常:除去不受檢查異常的所有異常。
      • image

10.0.0.2 運(yùn)用Java異常處理機(jī)制? 異常處理的原理?Java中檢查異常和非檢查異常的區(qū)別?

  • 運(yùn)用Java異常處理機(jī)制?
    • 1.try…catch語(yǔ)句
    • 2.finally語(yǔ)句:大多數(shù)情況下都必須執(zhí)行的代碼
    • 3.throws子句:聲明可能發(fā)生的異常類
    • 4.throw:拋出具體的異常對(duì)象。
  • 異常處理的原理?
    • Java虛擬機(jī)用方法調(diào)用棧(method invocation stack)來(lái)跟蹤每個(gè)線程中一系列的方法調(diào)用過(guò)程。如果在執(zhí)行方法過(guò)程中拋出異常,則Java虛擬機(jī)必須找到能捕獲該異常的catch代碼塊。當(dāng)Java虛擬機(jī)追溯到調(diào)用棧的底部的方法的時(shí)候,如果仍然沒(méi)有找到處理該異常的代碼塊,這樣它就會(huì)按步驟處理,首先會(huì)打印方法調(diào)用棧的異常信息,然后如果所處的線程不是主線程,那么就會(huì)終止這個(gè)線程。
  • Java中檢查異常和非檢查異常的區(qū)別
    • 檢查型異常(CheckedException)
      • 在Java中所有不是RuntimeException派生的Exception都是檢查型異常。當(dāng)函數(shù)中存在拋出檢查型異常的操作時(shí)該函數(shù)的函數(shù)聲明中必須包含throws語(yǔ)句。調(diào)用改函數(shù)的函數(shù)也必須對(duì)該異常進(jìn)行處理,如不進(jìn)行處理則必須在調(diào)用函數(shù)上聲明throws語(yǔ)句。
      • 檢查型異常是JAVA首創(chuàng)的,在編譯期對(duì)異常的處理有強(qiáng)制性的要求。在JDK代碼中大量的異常屬于檢查型異常,包括IOException,SQLException等等。
    • 非檢查型異常(UncheckedException)技術(shù)博客大總結(jié)
      • 在Java中所有RuntimeException的派生類都是非檢查型異常,與檢查型異常對(duì)比,非檢查型異常可以不在函數(shù)聲明中添加throws語(yǔ)句,調(diào)用函數(shù)上也不需要強(qiáng)制處理。
      • 常見的NullPointException,ClassCastException是常見的非檢查型異常。非檢查型異常可以不使用try…catch進(jìn)行處理,但是如果有異常產(chǎn)生,則異常將由JVM進(jìn)行處理。對(duì)于RuntimeException的子類最好也使用異常處理機(jī)制。雖然RuntimeException的異常可以不使用try…catch進(jìn)行處理,但是如果一旦發(fā)生異常,則肯定會(huì)導(dǎo)致程序中斷執(zhí)行,所以,為了保證程序再出錯(cuò)后依然可以執(zhí)行,在開發(fā)代碼時(shí)最好使用try…catch的異常處理機(jī)制進(jìn)行處理。

10.0.0.3 異常處理的過(guò)程中,你遵循那些好的實(shí)踐? throw 和 throws這兩個(gè)關(guān)鍵字在java中有什么不同?

  • 異常處理的過(guò)程中,你遵循那些好的實(shí)踐?
    • 異常處理在項(xiàng)目設(shè)計(jì)中是非常關(guān)鍵的,所以精通異常處理是十分必要的。異常處理有很多最佳實(shí)踐,下面列舉集中,它們提高你代碼的健壯性和靈活性:
      1. 調(diào)用方法的時(shí)候返回布爾值來(lái)代替返回null,這樣可以 NullPointerException。由于空指針是java異常里最惡心的異常。
      1. catch塊里別不寫代碼。空catch塊是異常處理里的錯(cuò)誤事件,因?yàn)樗皇遣东@了異常,卻沒(méi)有任何處理或者提示。通常你起碼要打印出異常信息,當(dāng)然你最好根據(jù)需求對(duì)異常信息進(jìn)行處理。
    • 3)能拋受控異常(checked Exception)就盡量不拋受非控異常(checked Exception)。通過(guò)去掉重復(fù)的異常處理代碼,可以提高代碼的可讀性。
      1. 絕對(duì)不要讓你的數(shù)據(jù)庫(kù)相關(guān)異常顯示到客戶端。由于絕大多數(shù)數(shù)據(jù)庫(kù)和SQLException異常都是受控異常,在Java中,你應(yīng)該在DAO層把異常信息處理,然后返回處理過(guò)的能讓用戶看懂并根據(jù)異常提示信息改正操作的異常信息。
      1. 在Java中,一定要在數(shù)據(jù)庫(kù)連接,數(shù)據(jù)庫(kù)查詢,流處理后,在finally塊中調(diào)用close()方法。
  • throw 和 throws這兩個(gè)關(guān)鍵字在java中有什么不同?
    • 技術(shù)博客大總結(jié)
    • throws總是出現(xiàn)在一個(gè)函數(shù)頭中,用來(lái)標(biāo)明該成員函數(shù)可能拋出的各種異常,你也可以申明未檢查的異常,但這不是編譯器強(qiáng)制的。如果方法拋出了異常那么調(diào)用這個(gè)方法的時(shí)候就需要將這個(gè)異常處理。
    • throw 是用來(lái)拋出任意異常的,按照語(yǔ)法你可以拋出任意 Throwable (Throwable 或任何Throwable的衍生類) , throw可以中斷程序運(yùn)行,因此可以用來(lái)代替return。
    private static voidshow() {  
        throw new UnsupportedOperationException(“拋出異常”);
    }
    

10.0.0.4 你知道什么是“異常鏈”嗎?自定義實(shí)現(xiàn)過(guò)哪些異常,怎么寫的?可以有一個(gè)空的catch塊嗎?

  • 你知道什么是“異常鏈”嗎?
    • “異常鏈”是Java中非常流行的異常處理概念,是指在進(jìn)行一個(gè)異常處理時(shí)拋出了另外一個(gè)異常,由此產(chǎn)生了一個(gè)異常鏈條。該技術(shù)大多用于將“ 受檢查異常” ( checked exception)封裝成為“非受檢查異常”(unchecked exception)或者RuntimeException。順便說(shuō)一下,如果因?yàn)橐驗(yàn)楫惓D銢Q定拋出一個(gè)新的異常,你一定要包含原有的異常,這樣,處理程序才可以通過(guò)getCause()和initCause()方法來(lái)訪問(wèn)異常最終的根源。
  • 自定義實(shí)現(xiàn)過(guò)哪些異常?
  • 可以有一個(gè)空的catch塊嗎?
    • 可以有一個(gè)空的catch塊,但這是最糟糕的編程的例子。不應(yīng)該有空的catch塊,因?yàn)槿绻惓1辉搲K捕獲,我們將沒(méi)有關(guān)于異常的信息,它將成為調(diào)試它的噩夢(mèng)。應(yīng)該至少有一個(gè)日志記錄語(yǔ)句來(lái)記錄控制臺(tái)或日志文件中的異常詳細(xì)信息。
    • 技術(shù)博客大總結(jié)

10.0.0.5 Java異常類有哪些的重要方法?導(dǎo)致“主線程中的異常”的不同場(chǎng)景是什么?

  • Java異常類有哪些的重要方法?
    • Exception和它的所有子類沒(méi)有提供任何特殊方法供使用,它們的所有方法都是來(lái)自其基類Throwable。
      • String getMessage():方法返回Throwable的String型信息,當(dāng)異常通過(guò)構(gòu)造器創(chuàng)建后可用。
      • String getLocalizedMessage():此方法通過(guò)被重寫來(lái)得到用本地語(yǔ)言表示的異常信息返回給調(diào)用程序。Throwable類通常只是用getMessage()方法來(lái)實(shí)現(xiàn)返回異常信息。
      • synchronized Throwable getCause():此方法返回異常產(chǎn)生的原因,如果不知道原因的話返回null。(原文有拼寫錯(cuò)誤 應(yīng)該是if 不是id)
      • String toString():方法返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息。
      • void printStackTrace():該方法打印棧軌跡信息到標(biāo)準(zhǔn)錯(cuò)誤流。該方法能接受PrintStream 和PrintWriter作為參數(shù)實(shí)現(xiàn)重載,這樣就能實(shí)現(xiàn)打印棧軌跡到文件或流中。
  • 導(dǎo)致“主線程中的異常”的不同場(chǎng)景是什么?
    • 一些常見的主線程異常情況是:
      • 線程main java.lang.UnsupportedClassVersionError中的異常:當(dāng)您的java類從另一個(gè)JDK版本編譯并且您試圖從另一個(gè)java版本運(yùn)行它時(shí),會(huì)出現(xiàn)此異常。
      • 線程main java.lang.NoClassDefFoundError中的異常 :此異常有兩種變體。 第一個(gè)是你提供擴(kuò)展名為.class的類全名的地方。 第二種情況是沒(méi)有找到類。
      • 線程main java.lang.NoSuchMethodError中的異常:main :當(dāng)您嘗試運(yùn)行一個(gè)沒(méi)有main方法的類時(shí),會(huì)出現(xiàn)此異常。
      • 技術(shù)博客大總結(jié)
      • 線程“main”中的異常java.lang.ArithmeticException :無(wú)論何時(shí)從main方法拋出任何異常,它都會(huì)打印出異常是console。 第一部分解釋了異常從main方法拋出,第二部分打印異常類名稱,然后在冒號(hào)后打印異常消息。

10.0.0.6 看下面這段子類繼承父類代碼有什么問(wèn)題?針對(duì)拋異常是IOException還是Exception,能隨便寫嗎,結(jié)合案例說(shuō)一下?

  • 看下面這段代碼有什么問(wèn)題?
    public class SuperClass {  
        public void start() throws IOException{
            throw new IOException("Not able to open file");
        }
    }
     
    public class SubClass extends SuperClass{  
        public void start() throws Exception{
            throw new Exception("Not able to start");
        }
    }
    
    • 這段代碼編譯器將對(duì)子類覆蓋start方法產(chǎn)生錯(cuò)誤。因?yàn)槊總€(gè)Java中方法的覆蓋是有規(guī)則的,一個(gè)覆蓋的方法不能拋出的異常比原方法繼承關(guān)系高。因?yàn)檫@里的start方法在超類中拋出了IOException,所有在子類中的start方法只能拋出要么是IOExcepition或是其子類,但不能是其超類,如Exception。
  • 針對(duì)拋異常是IOException還是Exception,能隨便寫嗎,結(jié)合案例說(shuō)一下?
    public static void start(){
       System.out.println("Java Exception");
    }
     
    public static void main(String args[]) {
       try{
          start();
       }catch(IOException e){
          e.printStackTrace();
       }
    }
    
    • 上面的Java異常例子代碼中,編譯器將在處理IOException時(shí)報(bào)錯(cuò),因?yàn)镮OException是受檢查異常,而start方法并沒(méi)有拋出IOException,所以編譯器將拋出“異常,java.io.IOException不會(huì)在try語(yǔ)句體中拋出”,但是如果你將IOException改為Exception,編譯器報(bào)錯(cuò)將消失,因?yàn)镋xception可以用來(lái)捕捉所有運(yùn)行時(shí)異常,這樣就不需要聲明拋出語(yǔ)句。我喜歡這樣帶有迷惑性的Java異常面試題,因?yàn)樗粫?huì)讓人輕易的找出是IOException還是Exception。你也可以在JoshuaBloach和NeilGafter的Java謎題中找到一些有關(guān)Java錯(cuò)誤和異常的具有迷惑性問(wèn)題。

10.0.0.7 捕獲異常時(shí),為何在catch中要注意異常層級(jí)關(guān)系?需要注意哪些問(wèn)題?

  • 捕獲異常時(shí),為何在catch中要注意異常層級(jí)關(guān)系?需要注意哪些問(wèn)題?
    • 注意,catch中一定要注意層級(jí)關(guān)系。這里舉一個(gè)簡(jiǎn)單的案例,就可以很好的理解為何要注重層級(jí)問(wèn)題呢!
    • 技術(shù)博客大總結(jié)
    public static void start() throws IOException, RuntimeException{
        throw new RuntimeException("Not able to Start");
    }
    
    public static void main(String args[]) {
        try {
            start();
        } catch (Exception e) {
            e.printStackTrace();
        } catch (RuntimeException e2) {
            e2.printStackTrace();
        }
    }
    
    • 這段代碼會(huì)在捕捉異常代碼塊的RuntimeException類型變量“e2”里拋出編譯異常錯(cuò)誤。因?yàn)镋xception是RuntimeException的超類,在start方法中所有的RuntimeException會(huì)被第一個(gè)捕捉異常塊捕捉,這樣就無(wú)法到達(dá)第二個(gè)捕捉塊,這就是拋出“exception java.lang.RuntimeException has already been caught”的編譯錯(cuò)誤原因。

其他介紹

01.關(guān)于博客匯總鏈接

02.關(guān)于我的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,701評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,694評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,026評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,193評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,719評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,668評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,846評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,394評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容