本文總結(jié)了關(guān)于Java異常的十大常見問題。
1. 有檢查的與無檢查的
(資料圖)
簡而言之,檢查型異常必須在方法中明確捕獲,或者在方法的throws子句中聲明。未檢查的異常是由無法解決的問題引起的,例如除以零、空指針等。被檢查的異常特別重要,因?yàn)槟阆M褂媚愕腁PI的其他開發(fā)者知道如何處理這些異常。
例如,IOException是一個常用的檢查異常,RuntimeException是一個未檢查的異常。在閱讀其他內(nèi)容之前,你可以先看看《Java 異常層次圖》。
Java 異常層次圖
2. 異常管理的最佳實(shí)踐
如果一個異??梢员徽_處理,那么它就應(yīng)該被捕獲,否則,它就應(yīng)該被拋出。
3. 為什么在try中定義的變量不能在catch或final中使用?
在下面的代碼中,在try塊中聲明的字符串s不能在catch子句中使用。這段代碼沒有通過編譯。
try { File file = new File("path"); FileInputStream fis = new FileInputStream(file); String s = "inside";} catch (FileNotFoundException e) { e.printStackTrace(); System.out.println(s);}
原因是你不知道在嘗試塊的什么地方會拋出異常。很有可能在對象被聲明之前就拋出了異常。在這個特定的例子中,情況就是如此。
4. 為什么Double.parseDouble(null)和Integer.parseInt(null)會產(chǎn)生不同的異常?
它們實(shí)際上拋出了不同的異常。這是JDK的一個問題。它們是由不同的開發(fā)者開發(fā)的,所以不值得過多的思考。
Integer.parseInt(null); // throws java.lang.NumberFormatException: null Double.parseDouble(null); // throws java.lang.NullPointerException
5. Java中常用的運(yùn)行時(shí)異常
下面是其中的一些。
非法參數(shù)異常(IllegalArgumentException
ArrayIndexOutOfBoundsException
當(dāng)條件不滿足時(shí),它們可以在if語句中使用,如下所示:
if (obj == null) { throw new IllegalArgumentException("obj can not be null");
6. 我們可以在同一個捕獲子句中捕獲多個異常嗎?
答案是肯定的。只要這些異常類可以追溯到類繼承層次中的同一個超類,你就可以只使用那個超類。
7. 在java中構(gòu)造函數(shù)可以拋出異常嗎?
答案是肯定的。構(gòu)造器是一種特殊的方法。下面是一個代碼例子。
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(); } }}
但為了提高代碼的可讀性,你應(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. return可以在finally塊中使用嗎?
是的,可以。
10. 為什么開發(fā)人員要默默地消耗異常?
有很多像下面這樣的代碼段發(fā)生。如何處理異常是如此重要,為什么開發(fā)人員一直這樣做?
try { ...} catch(Exception e) { e.printStackTrace();}
忽視只是簡單的。頻繁出現(xiàn)并不意味著正確性。