Java異常含面試題

1、Throwable

         1)Throwable是所有異常的超類,包含2個子類: error(錯誤)和exception(異常)。

         2)Throwable包含了其線程創建時執行堆棧的快照,它提供了printStackTrace()方法用來跟蹤線程在執行中的獲取堆棧的信息。

 

 

2、Error 

      1) Error類及其子類。是指程序在運行中,由於系統或者JVM出現的異常,導致程序被終止產生的一類異常。

        如:    StackOverflowError 棧溢出錯誤。OutOfMemoryError 內存不足錯誤。

 

3、Exception

     1) 程序本身可以捕獲並且可以處理的異常, Exception可分爲運行時異常和編譯時的異常。

       運行時異常:   

          RuntimeException及其子類,表示JVM在運行期間可能出現的異常。JVM不會去檢查此類異常,比如說NullPointerException 空指針異常,ArrayIndexOutBoundException數組下標越界異常, ClassCastException 類型強制轉換異常。此類異常屬於非檢查異常。比如說,除0,會出現異常,我們應該通過代碼來進行調整。

       編譯時異常:

          Exception中除RuntimeException及其子類出現的異常稱爲編譯時異常。JVM會檢查此類異常,比如IOException,文件讀取異常,ClassNotFoundException(沒有找到指定的類的異常)。

          處理方式: 

          1)通過throws在方法上聲明拋出。

          2)通過try..catch..捕獲異常來進行處理。

 

4、檢查型異常與非檢查型異常

 

       檢查型異常:

         檢查型異常是編譯器必須要處理的一類異常,除RuntimeException及其其他子類的異常不處理,其他的異常都屬於檢查型異常,如果不處理那麼會編譯不通過。 需要在方法名throws出去,或者自己用try{}catch來處理此類異常。

       非檢查型異常 

          非檢查型異常又稱爲運行時異常,所有RuntimeException及其子類的異常可以均表示爲運行時異常。 在程序運行中,由於自身邏輯而產生的一類異常,如NullPointerException,  下標越界異常。

 

5、 異常關鍵字

       finally: finally關鍵字總是在try..catch之後執行,主要是起到回收資源的作用,如數據庫連接釋放等,如果在finally裏有return或者throw等終止方法的語句,那麼就不會跳回原方法執行,不處理throw的異常的話,會導致程序終止。

       throw:  throw關鍵字能夠捕獲到的異常,不處理並向上拋出,在方法裏會被throws關鍵字給捕獲到,在方法內部拋出一個Throwable類型的異常。任何java代碼可以通過throw來拋出異常。

       throws: throws關鍵字一般聲明在方法上,用於可聲明的異常。

 

6、異常處理機制

      java異常的處理機制可分爲:  捕獲異常、拋出異常、聲明異常。

       :  非檢查異常(error,RuntimeException及其子類)不可使用throws關鍵字拋出。 

          一個方法出現編譯時異常,就需要 try-catch/ throws 處理,否則會導致編譯錯誤。   

 

7、常見的異常面試題

  • Error 和 Exception 區別是什麼?

    答:  Error類型是 JVM相關錯誤,如系統崩潰、內存不足、棧溢出,等編譯器對此類錯誤進行檢測,一旦發生此類錯誤,應用程序會發生終止。

          Exception是應用程序由於自身邏輯或者需要監測的異常造成的一類異常,通常遇到這種錯誤,應對其進行處理,使應用程序可以正常的進行。

  • 運行時異常和一般異常(受檢異常)區別是什麼?

    答: 運行時異常:  包含RuntimeException及其之類的一類異常,這類異常不會檢查。

          受檢異常:  JVM編譯器需要監測的一類異常,是Exception異常除掉RuntimeException及其之類的 一類異常,需要對其進行處理才能編譯通過,如IOException。

  • JVM 是如何處理異常的?

     答:  在一個方法中如果發生異常,這個方法會創建一個異常對象,並轉交給 JVM,該異常對象 包含異常名稱,異常描述以及異常發生時應用程序的狀態。創建異常對象並轉交給 JVM 的 過程稱爲拋出異常。可能有一系列的方法調用,最終才進入拋出異常的方法,這一系列方法 調用的有序列表叫做調用棧。JVM 會順着調用棧去查找看是否有可以處理異常的代碼,如果有,則調用異常處理代碼。 當 JVM 發現可以處理異常的代碼時,會把發生的異常傳遞給它。如果 JVM 沒有找到可 以處理該異常的代碼塊,JVM 就會將該異常轉交給默認的異常處理器(默認處理器爲 JVM 的一部分),默認異常處理器打印出異常信息並終止應用程序。

  •     final、finally、finalize 有什麼區別?

    答:   final 可以修飾類、方法、變量。final如果修飾類表示該類不能被繼承,如果修飾方法,表示該方法不能被重寫,若果修飾變量,表示該變量是常量,不能被重寫賦值。

           finally 一般用來處理異常必須要處理的代碼塊,一般可用來釋放資源。

           finalize 是jvm調用的一個方法,屬於Object類的一個方法,是垃圾回收器在執行垃圾回收之前必須執行的清理方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章