Java異常錯誤的面試題及答案

1) Java中什麼是Exception?java

  這個問題常常在第一次問有關異常的時候或者是面試菜鳥的時候問。我歷來沒見過面高級或者資深工程師的程序員

時候有人問這玩意,可是對於菜鳥,是很願意問這個的。簡單來講,異常是Java傳達給你的系統和程序錯誤的方面試

式。在java中,異常功能是經過實現好比Throwable,Exception,RuntimeException之類的類,而後還有一數據庫

些處理異常時候的關鍵字,好比throw,throws,try,catch,finally之類的。 全部的異常都是經過Throwable編程

衍生出來的。Throwable把錯誤進一步劃分爲 java.lang.Exception 和 java.lang.Error.  java.lang.Error 用數組

來處理系統錯誤,例如java.lang.StackOverFlowError 或者 Java.lang.OutOfMemoryError 之類的。而後編程語言

 Exception用來處理程序錯誤,請求的資源不可用等等。函數

2) Java中的檢查型異常和非檢查型異常有什麼區別?測試

  這又是一個很是流行的Java異常面試題,會出如今各類層次的Java面試中。檢查型異常和非檢查型異常的spa

主要區別在於其處理方式。檢查型異常須要使用try, catch和finally關鍵字在編譯期進行處理,不然會出現編譯

器會報錯。對於非檢查型異常則不須要這樣作。Java中全部繼承自java.lang.Exception類的異常都是檢查型

異常,全部繼承自RuntimeException的異常都被稱爲非檢查型異常。你也能夠查看下一篇文章來了解

 更多關於檢查型異常和非檢查型異常之間的區別。

3) Java中的NullPointerException和ArrayIndexOutOfBoundException之間有什麼相同之處?

  在Java異常面試中這並非一個很流行的問題,但會出如今不一樣層次的初學者面試中,用來測試應聘者對檢查

型異常和非檢查型異常的概念是否熟悉。順便說一下,該題的答案是,這兩個異常都是非檢查型異常,都繼承自RuntimeException。該問題可能會引出另外一個問題,即Java和C的數組有什麼不一樣之處,由於C裏面的數組是沒有

大小限制的,絕對不會拋出ArrayIndexOutOfBoundException。

4)在Java異常處理的過程當中,你遵循的那些最好的實踐是什麼?

  這個問題在面試技術經理是很是常見的一個問題。由於異常處理在項目設計中是很是關鍵的,因此精通異常處

理是十分必要的。異常處理有不少最佳實踐,下面列舉集中,它們提升你代碼的健壯性和靈活性:

1) 調用方法的時候返回布爾值來代替返回null,這樣能夠 NullPointerException。因爲空指針是java異常裏最惡

心的異常。

2) catch塊裏別不寫代碼。空catch塊是異常處理裏的錯誤事件,由於它只是捕獲了異常,卻沒有任何處理或者

提示。一般你起碼要打印出異常信息,固然你最好根據需求對異常信息進行處理。

3)能拋受控異常(checked Exception)就儘可能不拋受非控異常(checked Exception)。經過去掉重複的異常處

理代碼,能夠提升代碼的可讀性。

4) 絕對不要讓你的數據庫相關異常顯示到客戶端。因爲絕大多數數據庫和SQLException異常都是受控異常,在Java中,

你應該在DAO層把異常信息處理,而後返回處理過的能讓用戶看懂並根據異常提示信息改正操做的異常信息。

 
5) 在Java中,必定要在數據庫鏈接,數據庫查詢,流處理後,在finally塊中調用close()方法。
 

5) 既然咱們能夠用RuntimeException來處理錯誤,那麼你認爲爲何Java中還存在檢查型異常?

  這是一個有爭議的問題,在回答該問題時你應當當心。雖然他們確定願意聽到你的觀點,但其實他們最感興

趣的仍是有說服力的理由。我認爲其中一個理由是,存在檢查型異常是一個設計上的決定,受到了諸如C++等比

Java更早的編程語言設計經驗的影響。絕大多數檢查型異常位於java.io包內,這是合乎情理的,由於在你請求了

不存在的系統資源的時候,一段強壯的程序必須可以優雅的處理這種狀況。經過把IOException聲明爲檢查型異

常,Java 確保了你可以優雅的對異常進行處理。另外一個可能的理由是,可使用catch或finally來確保數量受限

的系統資源(好比文件描述符)在你使用後儘早獲得釋放。
 

6)  throw 和 throws這兩個關鍵字在java中有什麼不一樣?

一個java初學者應該掌握的面試問題。 throw 和 throws乍看起來是很類似的尤爲是在你仍是一個java初學者的時

候。儘管他們看起來類似,都是在處理異常時候使用到的。但在代碼裏的使用方法和用到的地方是不一樣的。throws

老是出如今一個函數頭中,用來標明該成員函數可能拋出的各類異常, 你也能夠申明未檢查的異常,但這不是編譯

器強制的。若是方法拋出了異常那麼調用這個方法的時候就須要將這個異常處理。另外一個關鍵字  throw 是用來

拋出任意異常的,按照語法你能夠拋出任意 Throwable (i.e. Throwable 或任何Throwable的衍生類) , throw

能夠中斷程序運行,所以能夠用來代替return . 最多見的例子是用 throw 在一個空方法中須要return的地方拋出 UnSupportedOperationException 代碼以下 :

1 1     private static voidshow() {  
2 2          throw new UnsupportedOperationException(「Not yet implemented」);
3 3      }

7) 什麼是「異常鏈」?

  「異常鏈」是Java中很是流行的異常處理概念,是指在進行一個異常處理時拋出了另一個異常,由此產生

了一個異常鏈條。該技術大多用於將「 受檢查異常」 ( checked exception)封裝成爲「非受檢查異常」

(unchecked exception)或者RuntimeException。順便說一下,若是由於由於異常你決定拋出一個新的異常,

你必定要包含原有的異常,這樣,處理程序才能夠經過getCause()和initCause()方法來訪問異常最終的根源。

8) 你曾經自定義實現過異常嗎?怎麼寫的?

  很顯然,咱們絕大多數都寫過自定義或者業務異常,像AccountNotFoundException。在面試過程當中詢問

這個Java異常問題的主要緣由是去發現你如何使用這個特性的。這能夠更準確和精緻的去處理異常,固然這也跟

你選擇checked 仍是unchecked exception息息相關。經過爲每個特定的狀況建立一個特定的異常,你就爲

調用者更好的處理異常提供了更好的選擇。相比通用異常(general exception),我更傾向更爲精確的異常。大

量的建立自定義異常會增長項目class的個數,所以,在自定義異常和通用異常之間維持一個平衡是成功的關鍵。

9) JDK7中對異常處理作了什麼改變?

 
  這是最近新出的Java異常處理的面試題。JDK7中對錯誤(Error)和異常(Exception)處理主要新增長了2個特性,

一是在一個catch塊中能夠出來多個異常,就像原來用多個catch塊同樣。另外一個是自動化資源管理(ARM), 也稱爲

try-with-resource塊。這2個特性均可以在處理異常時減小代碼量,同時提升代碼的可讀性。對於這些特性瞭解,

不只幫助開發者寫出更好的異常處理的代碼,也讓你在面試中顯的更突出。我推薦你們讀一下Java 7攻略,這樣

能夠更深刻的瞭解這2個很是有用的特性。

10) 你遇到過 OutOfMemoryError 錯誤嘛?你是怎麼搞定的?

  這個面試題會在面試高級程序員的時候用,面試官想知道你是怎麼處理這個危險的OutOfMemoryError錯誤的。

必須認可的是,無論你作什麼項目,你都會碰到這個問題。因此你要是說沒遇到過,面試官確定不會買帳。要是

你對這個問題不熟悉,甚至就是沒碰到過,而你又有三、4年的Java經驗了,那麼準備好處理這個問題吧。在回答

這個問題的同時,你也能夠藉機向面試秀一下你處理內存泄露、調優和調試方面的牛逼技能。我發現掌握這些技

術的人都能給面試官留下深入的印象。

 
11) 若是執行finally代碼塊以前方法返回告終果,或者JVM退出了,finally塊中的代碼還會執行嗎?

  這個問題也能夠換個方式問:「若是在try或者finally的代碼塊中調用了System.exit(),結果會是怎樣」。

瞭解finally塊是怎麼執行的,即便是try裏面已經使用了return返回結果的狀況,對了解Java的異常處理都很是

有價值。只有在try裏面是有System.exit(0)來退出JVM的狀況下finally塊中的代碼纔不會執行。

 
12)Java中final,finalize,finally關鍵字的區別

 
  這是一個經典的Java面試題了。個人一個朋友爲Morgan Stanley招電信方面的核心Java開發人員的時候就

問過這個問題。final和finally是Java的關鍵字,而finalize則是方法。final關鍵字在建立不可變的類的時候

很是有用,只是聲明這個類是final的。而finalize()方法則是垃圾回收器在回收一個對象前調用,但也Java規

範裏面沒有保證這個方法必定會被調用。finally關鍵字是惟一一個和這篇文章討論到的異常處理相關的關鍵字。

在你的產品代碼中,在關閉鏈接和資源文件的是時候都必需要用到finally塊。

13)下面的代碼都有哪些錯誤:

01     public static void start() throws IOException, RuntimeException{
02      
03        throw new RuntimeException(「Not able to Start」);
04     }
05      
06     public static void main(String args[]) {
07        try {
08              start();
09        } catch (Exception ex) {
10                ex.printStackTrace();
11        } catch (RuntimeException re) {
12                re.printStackTrace();
13        }
14     }

這段代碼會在捕捉異常代碼塊的RuntimeException類型變量「re」裏拋出編譯異常錯誤。由於Exception是RuntimeException的超類,在start方法中全部的RuntimeException會被第一個捕捉異常塊捕捉,這樣就沒法到

達第二個捕捉塊,這就是拋出「exception java.lang.RuntimeException has already been caught」的編譯錯誤緣由。

14)下面的Java代碼都有哪些錯誤:

01     public classSuperClass { 
02         public void start() throws IOException{
03             throw new IOException(「Not able to open file」);
04         }
05     }
06      
07     public class SubClass extendsSuperClass{ 
08         public void start() throws Exception{
09             throw new Exception(「Not able to start」);
10         }
11     }

這段代碼編譯器將對子類覆蓋start方法產生不滿。由於每一個Java中方法的覆蓋是有規則的,一個覆蓋的方法

不能拋出的異常比原方法繼承關係高。由於這裏的start方法在超類中拋出了IOException,全部在子類中的start

方法只能拋出要麼是IOExcepition或是其子類,但不能是其超類,如Exception。

15)下面的Java異常代碼有什麼錯誤:

01     public static void start(){
02        System.out.println(「Java Exception interivew question Answers for Programmers」);
03     }
04      
05     public static void main(String args[]) {
06        try{
07           start();
08        }catch(IOException ioe){
09           ioe.printStackTrace();
10        }
11     }

上面的Java異常例子代碼中,編譯器將在處理IOException時報錯,由於IOException是受檢查異常,而start

方法並無拋出IOException,因此編譯器將拋出「異常, java.io.IOException 不會在try語句體中拋出」,但

是若是你將IOException改成Exception,編譯器報錯將消失,由於Exception能夠用來捕捉全部運行時異常,這樣

就不須要聲明拋出語句。我喜歡這樣帶有迷惑性的Java異常面試題,由於它不會讓人輕易的找出是IOException還

是Exception。你也能夠在 Joshua Bloach和Neil Gafter的Java謎題中找到一些有關Java錯誤和異常的具備迷惑

性問題。

相關文章
相關標籤/搜索