分類: Java(35)
目錄(?)[+]
Java包含兩種異常:checked異常和unchecked異常。C#只有unchecked異常。checked和unchecked異常之間的區別是:
Checked異常必須被顯式地捕獲或者傳遞,如Basic try-catch-finally Exception Handling一文中所說。而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; //read lots of data over HTTP and return //it as a String instance. return data; } 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 storeDataFromUrl(String url){ String data = readDataFromUrl(url); }