Java中RuntimeException和Exception的區別
在java的異常類體系中,Error和RuntimeException是非檢查型異常,其他的都是檢查型異常。
所有方法都可以在不聲明throws的情況下拋出RuntimeException及其子類
不可以在不聲明的情況下拋出非RuntimeException
簡單的說,非RuntimeException要自己寫catch塊處理掉。
1.RuntimeException
今天摩根IT電面的時候被問到Exception和RuntimeException的區別,當時答不出來,大囧,晚上來學習一下。
首先看一段代碼,主要內容就是將字符串類型的數字轉化為整型的數字,然後讓兩個數字相乘,代碼如下:
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 Codepublic 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 Codeclass 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: 自定義異常
常見的RuntimeException- -
RuntimeException是開發中最容易遇到的,下面列舉一下常見的RuntimeException:
1、NullPointerException:見的最多了,其實很簡單,一般都是在null對象上調用方法了。
String s=null;
boolean eq=s.equals(""); // NullPointerException
這裏你看的非常明白了,為什麽一到程序中就暈呢?
public int getNumber(String str){
if(str.equals("A")) return 1;
else if(str.equals("B")) return 2;
}
這個方法就有可能拋出NullPointerException,我建議你主動拋出異常,因為代碼一多,你可能又暈了。
public int getNumber(String str){
if(str==null) throw new NullPointerException("參數不能為空");
//你是否覺得明白多了
if(str.equals("A")) return 1;
else if(str.equals("B")) return 2;
}
2、NumberFormatException:繼承IllegalArgumentException,字符串轉換為數字時出現。比如int i= Integer.parseInt("ab3");
3、ArrayIndexOutOfBoundsException:數組越界。比如 int[] a=new int[3]; int b=a[3];
4、StringIndexOutOfBoundsException:字符串越界。比如 String s="hello"; char c=s.chatAt(6);
5、ClassCastException:類型轉換錯誤。比如 Object obj=new Object(); String s=(String)obj;
6、UnsupportedOperationException:該操作不被支持。如果我們希望不支持這個方法,可以拋出這個異常。既然不支持還要這個幹嗎?有可能子類中不想支持父類中有的方法,可以直接拋出這個異常。
7、ArithmeticException:算術錯誤,典型的就是0作為除數的時候。
8、IllegalArgumentException:非法參數,在把字符串轉換成數字的時候經常出現的一個異常,我們可以在自己的程序中好好利用這個異常。
Java中RuntimeException和Exception的區別