關(guān)于Java異常的十大問(wèn)題
1.選中與未選中
簡(jiǎn)而言之,檢查異常必須在方法中顯式捕獲或在方法的 throws 子句中聲明。未經(jīng)檢查的異常是由無(wú)法解決的問(wèn)題引起的,例如除以零、空指針等。經(jīng)檢查的異常尤其重要,因?yàn)槟M褂媚?API 的其他開(kāi)發(fā)人員知道如何處理異常。
例如,IOException 是常用的已檢查異常,而 RuntimeException 是未檢查異常。在閱讀其余部分之前,您可以查看Java 異常層次圖。
2. 異常管理的優(yōu)秀實(shí)踐
如果可以正確處理異常,則應(yīng)將其捕獲,否則應(yīng)將其拋出。
3、為什么try中定義的變量不能在catch或finally中使用?
在下面的代碼中,try 塊中聲明的字符串s 不能在catch 子句中使用。代碼沒(méi)有通過(guò)編譯。
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
原因是您不知道在 try 塊中的哪個(gè)位置會(huì)拋出異常。很可能在聲明對(duì)象之前拋出異常。對(duì)于這個(gè)特定的示例,這是正確的。
4. 為什么 Double.parseDouble(null) 和 Integer.parseInt(null) 會(huì)拋出不同的異常?
他們實(shí)際上拋出了不同的異常。這是JDK的問(wèn)題。它們是由不同的開(kāi)發(fā)人員開(kāi)發(fā)的,因此不值得過(guò)多思考。
Integer.parseInt(null);
// throws java.lang.NumberFormatException: null
Double.parseDouble(null);
// throws java.lang.NullPointerException
5、Java中常用的運(yùn)行時(shí)異常
這里只是其中的一些。
IllegalArgumentException
ArrayIndexOutOfBoundsException
當(dāng)條件不滿(mǎn)足時(shí),可以在 if 語(yǔ)句中使用它們,如下所示:
if (obj == null) {
throw new IllegalArgumentException("obj can not be null");
6.我們可以在同一個(gè)catch子句中捕獲多個(gè)異常嗎?
答案是肯定的。只要這些異常類(lèi)可以追溯到類(lèi)繼承層次結(jié)構(gòu)中的同一個(gè)超類(lèi),您就可以只使用該超類(lèi)。
7、java中構(gòu)造函數(shù)可以?huà)伋霎惓?
答案是肯定的。構(gòu)造函數(shù)是一種特殊的方法。這是一個(gè)代碼示例。
8. 在 final 子句中拋出異常
執(zhí)行以下操作是合法的:
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();
}
}
}
但是為了獲得更好的代碼可讀性,您應(yīng)該將嵌入的 try-catch 塊包裝為新方法,然后將方法調(diào)用放在 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. 為什么開(kāi)發(fā)者默默消費(fèi)異常?
有很多像下面這樣的時(shí)間碼段。如果正確處理異常如此重要,為什么開(kāi)發(fā)人員繼續(xù)這樣做?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
忽略很容易。頻繁出現(xiàn)并不代表正確。