本文由 ImportNew - 韓遠青 翻譯自 Journaldev。java
Java提供了一個健壯的、面向對象的方法來處理出現異常,稱爲Java異常處理。我之前寫過一篇長文章來介紹Java異常處理,今天我將列出一些重要的Java異常面試的問題及答案,但願對大家的面試有所幫助。面試
答:異常是發生在程序執行過程當中阻礙程序正常執行的錯誤事件。好比:用戶輸入錯誤數據、硬件故障、網絡阻塞等都會致使出現異常。只要在Java語句執行中產生了異常,一個異常對象就會被建立,JRE就會試圖尋找異常處理程序來處理異常。若是有合適的異常處理程序,異常對象就會被異常處理程序接管,不然,將引起運行環境異常,JRE終止程序執行。 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塊總會被執行。對象
答: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();
}