1.RuntimeException
今天摩根IT電面的時候被問到Exception和RuntimeException的區別,當時答不出來,大囧,晚上來學習一下。
首先看一段代碼,主要內容就是將字符串類型的數字轉化為整型的數字,然后讓兩個數字相乘,代碼如下:
View Code
public class RuntimeException { public static void main(String[] args) { // TODO Auto-generated method stub String str="123"; int temp=Integer.parseInt(str); System.out.println(temp*temp); } }
查看parseInt方法的源代碼如下:
View Code
public static int parseInt(String s) throws NumberFormatException { return parseInt(s,10); }
我們發現這個方法中拋出了NumberFormatException異常,但是在上面的代碼中我們沒有找到try...catch來處理,這是為什么呢。按照我們異常處理的知識,如果一個方法通過throws拋出了異常,那么可以在拋出異常的方法中不使用try...catch,但是在調用這個方法的地方必須有try...catch來處理。
下面來觀察NumberFormatException類的繼承關系:

從上圖我們可以發現NumberFormatException是RuntimeException的子類,那么這就需要我們清楚Exception和RuntimeException的概念:
- Exception:在程序中必須使用try...catch進行處理。
- RuntimeException:可以不使用try...catch進行處理,但是如果有異常產生,則異常將由JVM進行處理。
對於RuntimeException的子類最好也使用異常處理機制。雖然RuntimeException的異常可以不使用try...catch進行處理,但是如果一旦發生異常,則肯定會導致程序中斷執行,所以,為了保證程序再出錯后依然可以執行,在開發代碼時最好使用try...catch的異常處理機制進行處理。
2.User Defined Exception
下面給出一個自定義異常的實例:
View Code
class MyException extends Exception{ public MyException(String msg){ super(msg); } } public class DefaultException { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try{ throw new MyException("自定義異常"); }catch(Exception e){ System.out.println(e);//edu.sjtu.ist.comutil.MyException: 自定義異常 //System.err.println(e); // e.printStackTrace(); // StackTraceElement[] sts = e.getStackTrace(); // for (StackTraceElement st : sts){ // System.err.println(st); // } // System.err.println(e.getStackTrace()); } } }
輸出結果為:
MyException: 自定義異常
