本文介紹了 10 個關於 Java 異常的最常見問題。
1. 可驗證與不可驗證
簡而言之,檢查的異常必須在方法體中明確捕獲或在方法的 throws 部分中聲明。未檢查異常是由於無法解決的問題引起的,例如除以0、空指標等。檢查異常尤其重要,因為您希望使用您的 API 的其他開發人員知道如何處理異常。例如,IOException是常用的檢查異常,而RuntimeException是非檢查異常。在進一步閱讀之前,請先查看
Java 中的分層異常圖。
2. 處理異常的最佳方式
如果異常能夠正確處理,則必須捕獲,否則必須轉送。
3.為什麼try中定義的變數不能在catch或finally使用?
在下面的程式碼中,try 區塊中宣告的行不能在 catch 區塊中使用。該程式碼將無法編譯。
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
原因是不知道 try 區塊中的何處可能引發異常。有可能在聲明物件之前拋出異常。對於這個例子來說也是如此。
4. 為什麼 Double.parseDouble(null) 和 Integer.parseInt(null) 會拋出不同的例外?
沒錯,他們確實提出了不同的例外。這是一個 JDK 問題。它們只是由不同的人設計的,您不必太擔心。
Integer.parseInt(null);
Double.parseDouble(null);
5. Java中的基本運行時異常
這裡有幾個:
IllegalArgumentException
ArrayIndexOutOfBoundsException
當條件不滿足時,它們可以在 if 語句中使用,如下所示:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. 是否可以在一個catch區塊中捕捉多個異常?
答案是肯定的。只要這些異常的類別可以沿著類別繼承層次結構追溯到同一個超類,就只能使用該超類別。
7. 建構子可以拋出異常嗎?
答案是肯定的。構造函數只是一種特殊的方法。
這是一個程式碼範例。
8. 在最後一個區塊中拋出異常
原則上,你可以完全合法地這樣做:
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
但為了保持程式碼的可讀性,您需要將巢狀區塊宣告
try-catch
為新方法,並將對此方法的呼叫插入到該區塊中
finally
。
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9. 是否可以在finally 區塊中使用return?
是的你可以。
10.為什麼開發者要悄悄處理異常?
例如,這樣的程式碼片段經常出現。如果正確的異常處理如此重要,為什麼開發人員會繼續這樣寫呢?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
這是最容易被忽略的。但即使經常這樣做,也不代表它是正確的。連結:
- Java 中的未檢查異常
- Java中分層異常樹的根
- 關於stackoverflow上的異常問題
來源文章
GO TO FULL VERSION