1. 程式人生 > >Java異常相關的面試題(上)

Java異常相關的面試題(上)

1)java中什麼是Exception ?

       簡單的說,異常就是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中的檢查型異常和非檢查型異常有什麼區別?

     檢查型異常和非檢查型異常的主要區別在於其處理方式。檢查型異常都需要使用 try,catch 和finally 關鍵字在編譯器進行處理,否則會出現編譯器報錯。對於非檢查型異常則不需要這樣做。java中所有繼承  Exception 的類的異常都是檢查型異常,所有繼承 RuntimeException 的異常都被稱為 非檢查型異常。 

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

    這兩個異常都是非檢查性異常,都是繼承於 RuntimeException. 

4). final, finally, finalize的區別。

final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內部類要訪問區域性變數,區域性變數必須定義成final型別
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫
 
5). 執行時異常與一般異常有何異同?
異常表示程式執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯誤。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。
 
6)  error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢位。不可能指望程式能處理這樣的情況。
exception 表示一種設計或實現問題。也就是說,它表示如果程式執行正常,從不會發生的情況。
 
7) Java中的異常處理機制的簡單原理和應用。
異常是指java程式執行時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等資訊,可以用一個物件來表示,Java使用面向物件的方式來處理異常,它把程式中發生的每個異常也都分別封裝到一個物件來表示的,該物件中包含有異常的資訊。

Java對異常進行了分類,不同型別的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:Error和Exception,Error 表示應用程式本身無法克服和恢復的一種嚴重問題,程式只有死的份了,例如,說記憶體溢位和執行緒死鎖等系統問題。Exception表示程式還能夠克服和恢復的問題,其中又分為系統異常和普通異常,系統異常是軟體本身缺陷所導致的問題,也就是軟體開發人員考慮不周所導致的問題,軟體使用者無法克服和恢復這種問題,但在這種問題下還可以讓軟體系統繼續執行或者讓軟體死掉,例如,陣列指令碼越界(ArrayIndexOutOfBoundsException),空指標異常(NullPointerException)、類轉換異常(ClassCastException);普通異常是執行環境的變化或異常所導致的問題,是使用者能夠克服的問題,例如,網路斷線,硬碟空間不夠,發生這樣的異常後,程式不應該死掉。java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws宣告繼續拋給上層呼叫方法處理,所以普通異常也稱為checked異常,而系統異常可以處理也可以不處理,所以,編譯器不強制用try..catch處理或用throws宣告,所以系統異常也稱為unchecked異常。
 
8) 請寫出你最常見到的5個runtime exception。

NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
 
9) JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以丟擲異常嗎?
Java 通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在 Java 中,每個異常都是一個物件,它是 Throwable 類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java 的異常處理是通過 5 個關鍵詞來實現的:try、catch、throw、throws 和 finally。一般情況下是用 try 來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理; try 用來指定一塊預防所有“異常”的程式; catch 子句緊跟在 try 塊後面,用來指定你想要捕捉的“異常”的型別; throw 語句用來明確地丟擲一個“異常”; throws 用來標明一個成員函式可能丟擲的各種“異常”;Finally 為確保一段程式碼不管發生什麼“異常”都被執行一段程式碼;可以在一個成員函式呼叫的外面寫一個 try 語句,    在這個成員函式內部寫另一個 try 語句保護其他程式碼。每當遇到一個 try 語句,“異常”的框架就放到堆疊上面,直到所有的 try 語句都完成。如果下一級的 try 語句沒有對某種“異常”進行處理,堆疊就會展開,直到遇到有處理這種“異常”的 try 語句。