1. 程式人生 > >Java異常常見面試問題總結

Java異常常見面試問題總結

Java提供了一個健壯的、面向物件的方法來處理出現異常,稱為Java異常處理。 我以前寫過一篇長文章來介紹Java異常處理,今天我將列出一些重要的Java異常面試的問題及答案,希望對你們的面試有所幫助。

1.什麼是Java異常

答:異常是發生在程式執行過程中阻礙程式正常執行的錯誤事件。比如:使用者輸入錯誤資料、硬體故障、網路阻塞等都會導致出現異常。 只要在Java語句執行中產生了異常,一個異常物件就會被建立,JRE就會試圖尋找異常處理程式來處理異常。如果有合適的異常處理程式,異常物件就會被異常處理程式接管,否則,將引發執行環境異常,JRE終止程式執行。 Java異常處理框架只能處理執行時錯誤,編譯錯誤不在其考慮範圍之內。

2.Java異常處理中有哪些關鍵字?

答:

  • throw:有時我們需要顯式地建立並丟擲異常物件來終止程式的正常執行。throw關鍵字用來丟擲並處理執行時異常。
  • throws:當我們丟擲任何“被檢查的異常(checked exception)”並不處理時,需要在方法簽名中使用關鍵字throws來告知呼叫程式此方法可能會丟擲的異常。呼叫方法可能會處理這些異常,或者同樣用throws來將異常傳給上一級呼叫方法。throws關鍵字後可接多個潛在異常,甚至是在main()中也可以使用throws。
  • try-catch:我們在程式碼中用try-catch塊處理異常。當然,一個try塊之後可以有多個catch子句,try-catch塊也能巢狀。每個catch塊必須接受一個(且僅有一個)代表異常型別的引數。
  • finally:finally塊是可選的,並且只能配合try-catch一起使用。雖然異常終止了程式的執行,但是還有一些開啟的資源沒有被關閉,因此,我們能使用finally進行關閉。不管異常有沒有出現,finally塊總會被執行。

3.描述一下異常的層級。

答:Java異常是層級的,並通過繼承來區分不同種類的異常。

  • Throwable是所有異常的父類,它有兩個直接子物件Error,Exception,其中Exception又被繼續劃分為“被檢查的異常(checked exception)”和”執行時的異常(runtime exception,即不受檢查的異常)”。 Error表示編譯時和系統錯誤,通常不能預期和恢復,比如硬體故障、JVM崩潰、記憶體不足等。
  • 被檢查的異常(Checked exception)在程式中能預期,並要嘗試修復,如FileNotFoundException。我們必須捕獲此類異常,併為使用者提供有用資訊和合適日誌來進行除錯。Exception是所有被檢查的異常的父類。
  • 執行時異常(Runtime Exception)又稱為不受檢查異常,源於糟糕的程式設計。比如我們檢索陣列元素之前必須確認陣列的長度,否則就可能會丟擲ArrayIndexOutOfBoundException執行時異常。RuntimeException是所有執行時異常的父類。

4.Java異常類有哪些的重要方法?

答:Exception和它的所有子類沒有提供任何特殊方法供使用,它們的所有方法都是來自其基類Throwable。

  • String getMessage():方法返回Throwable的String型資訊,當異常通過構造器建立後可用。
  • String getLocalizedMessage():此方法通過被重寫來得到用本地語言表示的異常資訊返回給呼叫程式。Throwable類通常只是用getMessage()方法來實現返回異常資訊。
  • synchronized Throwable getCause():此方法返回異常產生的原因,如果不知道原因的話返回null。(原文有拼寫錯誤 應該是if 不是id)
  • String toString():方法返回String格式的Throwable資訊,此資訊包括Throwable的名字和本地化資訊。
  • void printStackTrace():該方法列印棧軌跡資訊到標準錯誤流。該方法能接受PrintStream 和PrintWriter作為引數實現過載,這樣就能實現列印棧軌跡到檔案或流中。

5.描述Java 7 ARM(Automatic Resource Management,自動資源管理)特徵和多個catch塊的使用

答:如果一個try塊中有多個異常要被捕獲,catch塊中的程式碼會變醜陋的同時還要用多餘的程式碼來記錄異常。有鑑於此,Java 7的一個新特徵是:一個catch子句中可以捕獲多個異常。示例程式碼如下:

catch(IOException | SQLException | Exception ex){
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

大多數情況下,當忘記關閉資源或因資源耗盡出現執行時異常時,我們只是用finally子句來關閉資源。這些異常很難除錯,我們需要深入到資源使用的每一步來確定是否已關閉。因此,Java 7用try-with-resources進行了改進:在try子句中能建立一個資源物件,當程式的執行完try-catch之後,執行環境自動關閉資源。下面是這方面改進的示例程式碼:

try (MyResource mr = new MyResource()) {
            System.out.println("MyResource created in try-with-resources");
        } catch (Exception e) {
            e.printStackTrace();
        }