開篇介紹
大家好,我是Java最全面試題庫
的提褲姐,今天這篇是面試系列的第七篇,主要總結了JavaSE中異常類相關面試題,在後續,會沿着第一篇開篇的知識線路一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天養成一個好習慣。
說一下Java中的異常體系?
Error和Exception的區別?
Error(錯誤):
系統中的錯誤,是在程序編譯時出現的錯誤,只能通過修改程序才能修正。一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。
Exception(異常):
表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程序恢復運行,而不應該隨意終止異常。
寫出你最常見的 5 個 RuntimeException?
- java.lang.NullPointerException 空指針異常;出現原因:調用了未經初始化的對象或者是不存在的對象。
- java.lang.ClassNotFoundException 指定的類找不到;出現原因:類的名稱和路徑加載錯誤;通常都是程序
試圖通過字符串來加載某個類時可能引發異常。 - java.lang.NumberFormatException 字符串轉換爲數字異常;出現原因:字符型數據中包含非數字型字符。
- java.lang.IndexOutOfBoundsException 數組角標越界異常,常見於操作數組對象時發生。
- java.lang.IllegalArgumentException 方法傳遞參數錯誤。
- java.lang.ClassCastException 數據類型轉換異常。
如何處理異常?
異常的處理方式有兩種:
- ⾃⼰處理。
- 向上拋, 交給調⽤者處理。
具體的處理方式的選擇原則:
- 自己明確的知道如何處理的, 就要處理掉。
- 不知道如何處理的, 就交給調⽤者處理。
注:異常, 不能捕獲了之後什麼也不做。或者只是使⽤e.printStacktrac
try()裏面有⼀個return語句, 那麼後面的finally{}裏面的代碼會不會被執行?什麼時候執行,return前還是return後?
如果try中有return語句, 那麼finally中的代碼還是會執⾏。
因爲return表示的是要整個方法體返回, 所以,finally中的語句會在return之前執⾏。
但是return前執行的finally塊內,對數據的修改效果對於引用類型和值類型會所不同:
// 測試 修改值類型
static int f() {
int ret = 0;
try {
return ret; // 返回 0,finally內的修改效果不起作用
} finally {
ret++;
System.out.println("finally執行");
}
}
// 測試 修改引用類型
static int[] f2(){
int[] ret = new int[]{0};
try {
return ret; // 返回 [1],finally內的修改效果起了作用
} finally {
ret[0]++;
System.out.println("finally執行");
}
調用下面的方法,得到的返回值是什麼?
public int getNum() {
try {
int a = 1 / 0;
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
返回值爲3。
代碼在走到第 3 行的時候遇到了一個 MathException,這時第四行的代碼就不會執行了,代碼直接跳轉到 catch語句中,走到第 6 行的時候,異常機制有這麼一個原則如果在 catch 中遇到了 return 或者異常等能使該函數終止的話那麼有 finally 就必須先執行完 finally 代碼塊裏面的代碼然後再返回值。因此代碼又跳到第 8 行,可惜第 8 行是一個return 語句,那麼這個時候方法就結束了,因此第 6 行的返回結果就無法被真正返回。如果 finally 僅僅是處理了一個釋放資源的操作,那麼該道題最終返回的結果就是 2。因此上面返回值是 3。
throw 和 throws 的區別?
throw:
- throw 語句用在方法體內,表示拋出異常,由方法體內的語句處理。
- throw 是具體向外拋出異常的動作,所以它拋出的是一個異常實例,執行 throw 一定是拋出了某種異常。
throws:
- throws 語句是用在方法聲明後面,表示如果拋出異常,由該方法的調用者來進行異常的處理。
- throws 主要是聲明這個方法會拋出某種類型的異常,讓它的使用者要知道需要捕獲的異常的類型。
- throws 表示出現異常的一種可能性,並不一定會發生這種異常。