JavaRush /Java Blog /Random-TW /關於 Java 異常的十大問題
raynn
等級 31
Нижний Новгород

關於 Java 異常的十大問題

在 Random-TW 群組發布
本文介紹了 10 個關於 Java 異常的最常見問題。 關於 Java 異常的十大問題 - 1

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);
// вызывает java.lang.NumberFormatException: null

Double.parseDouble(null);
// вызывает java.lang.NullPointerException

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();
}
這是最容易被忽略的。但即使經常這樣做,也不代表它是正確的。連結:
  1. Java 中的未檢查異常
  2. Java中分層異常樹的根
  3. 關於stackoverflow上的異常問題
來源文章
還有什麼要讀的:

Java 中的異常

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION