Java異常:選擇Checked Exception還是Unchecked Exception?
Java包含兩種異常:
checked異常 和
unchecked異常 。
checked和unchecked異常之間的區別是: Checked異常必須被顯式地 捕獲 或者 傳遞(向上拋出,沿著調用棧 繼續向上傳播該異常),如try-catch-finally ,throws Exception 。而unchecked異常則可以不必 捕獲 或 拋出。
Checked異常繼承自 java.lang.Exception類(一般異常)。Unchecked異常繼承自java.lang.RuntimeException類(運行時異常)。
有許多支援或者反對二者甚至是否應該使用checked異常的爭論。本文將討論一些常見的觀點。開始之前,先澄清一個問題:
Checked和unchecked異常從功能的角度來講是等價的。可以用checked異常實現的功能必然也可以用unchecked異常實現,反之亦然。
選擇checked異常還是unchecked異常是個人習慣或者組織規定問題。並不存在誰比誰強大的問題。 一個簡單的例子
在討論checked和unchecked異常的優缺點前先看一下代碼中如下使用它們。下面是一個拋出checked異常的方法,另一個方法調用了它:
[java] view plain copy public void storeDataFromUrl(String url){ try { String data = readDataFromUrl(url); } catch (BadUrlException e) { e.printStackTrace(); } } public String readDataFromUrl(String url) throws BadUrlException{ if(isUrlBad(url)){ throw new BadUrlException("Bad URL: " + url); } String data = null; return data; } readDataFromUrl()方法拋出了BadUrlException。。。。由於第11行拋出異常,readDataFromUrl()方法 也必須拋出BadUrlException。否則程式報錯。 BadUrlException是我自己實現的一個類。由於BadUrlException繼承自java.lang.Exception,因而它是checked異常:
[java] view plain copy public class BadUrlException extends Exception { public BadUrlException(String s) { super(s); } } 如果storeDataFromUrl()方法想要調用readDataFromUrl(), 它只有兩種選擇。要麼捕獲BadUrlException,要麼 沿著調用棧 繼續向上傳播該異常。 上面的代碼中storeDataFromUrl() 捕獲了異常。向上傳播異常的實現方法如下:
[java] view plain copy public void storeDataFromUrl(String url) throws BadUrlException{ String data = readDataFromUrl(url); } 可以看到,上述代碼去掉了catch塊,方法聲明中加上了throws BadUrlException。 =============================================================================================== ===============================================================================================
下面,討論一下unchecked異常的實現方法。首先,將BadUrlException改為繼承自java.lang.RuntimeException:
[java] view plain copy public class BadUrlException extends RuntimeException { public BadUrlException(String s) { super(s); } } 然後,把方法中的異常改為unchecked BadUrlException:
[java] view plain copy public void