java runtime 异常_Java中RuntimeException和Exception
在java的異常類(lèi)體系中,Error和RuntimeException是非檢查型異常,其他的都是檢查型異常。
所有方法都可以在不聲明throws的情況下拋出RuntimeException及其子類(lèi)
不可以在不聲明的情況下拋出非RuntimeException
簡(jiǎn)單的說(shuō),非RuntimeException必要自己寫(xiě)catch塊處理掉。
RuntimeException不用try catch捕捉將會(huì)導(dǎo)致程序運(yùn)行中斷,若用則不會(huì)中斷
1.RuntimeException
今天摩根IT電面的時(shí)候被問(wèn)到Exception和RuntimeException的區(qū)別,當(dāng)時(shí)答不出來(lái),大囧,晚上來(lái)學(xué)習(xí)一下。
首先看一段代碼,主要內(nèi)容就是將字符串類(lèi)型的數(shù)字轉(zhuǎn)化為整型的數(shù)字,然后讓兩個(gè)數(shù)字相乘,代碼如下:
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);
}
}
產(chǎn)看parseInt方法的源代碼如下:
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
我們發(fā)現(xiàn)這個(gè)方法中拋出了NumberFormatException異常,但是在上面的代碼中我們沒(méi)有找到try...catch來(lái)處理,這是為什么呢。按照我們異常處理的知識(shí),如果一個(gè)方法通過(guò)throws拋出了異常,那么可以在拋出異常的方法中不適用try...catch,但是在調(diào)用這個(gè)方法的地方必須有try...catch來(lái)處理。
下面來(lái)觀察NumberFormatException類(lèi)的繼承關(guān)系:
從上圖我們可以發(fā)現(xiàn)NumberFormatException是RuntimeException的子類(lèi),那么這就需要我們清楚Exception和RuntimeException的概念:
Exception:在程序中必須使用try...catch進(jìn)行處理。
RuntimeException:可以不使用try...catch進(jìn)行處理,但是如果有異常產(chǎn)生,則異常將由JVM進(jìn)行處理。
對(duì)于RuntimeException的子類(lèi)最好也使用異常處理機(jī)制。雖然RuntimeException的異常可以不使用try...catch進(jìn)行處理,但是如果一旦發(fā)生異常,則肯定會(huì)導(dǎo)致程序中斷執(zhí)行,所以,為了保證程序再出錯(cuò)后依然可以執(zhí)行,在開(kāi)發(fā)代碼時(shí)最好使用try...catch的異常處理機(jī)制進(jìn)行處理。
2.User Defined Exception
下面給出一個(gè)自定義異常的實(shí)例
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());
}
}
}
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());
}
}
}
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());
}
}
}
輸出結(jié)果為:
MyException: 自定義異常
常見(jiàn)的RuntimeException- -
RuntimeException是開(kāi)發(fā)中最容易遇到的,下面列舉一下常見(jiàn)的RuntimeException:
1、NullPointerException:見(jiàn)的最多了,其實(shí)很簡(jiǎn)單,一般都是在null對(duì)象上調(diào)用方法了。
String s=null;
boolean eq=s.equals(""); // NullPointerException
這里你看的非常明白了,為什么一到程序中就暈?zāi)?#xff1f;
public int getNumber(String str){
if(str.equals("A")) return 1;
else if(str.equals("B")) return 2;
}
這個(gè)方法就有可能拋出NullPointerException,我建議你主動(dòng)拋出異常,因?yàn)榇a一多,你可能又暈了。
public int getNumber(String str){
if(str==null) throw new NullPointerException("參數(shù)不能為空");
//你是否覺(jué)得明白多了
if(str.equals("A")) return 1;
else if(str.equals("B")) return 2;
}
2、NumberFormatException:繼承IllegalArgumentException,字符串轉(zhuǎn)換為數(shù)字時(shí)出現(xiàn)。比如int i= Integer.parseInt("ab3");
3、ArrayIndexOutOfBoundsException:數(shù)組越界。比如 int[] a=new int[3]; int b=a[3];
4、StringIndexOutOfBoundsException:字符串越界。比如 String s="hello"; char c=s.chatAt(6);
5、ClassCastException:類(lèi)型轉(zhuǎn)換錯(cuò)誤。比如 Object obj=new Object(); String s=(String)obj;
6、UnsupportedOperationException:該操作不被支持。如果我們希望不支持這個(gè)方法,可以拋出這個(gè)異常。既然不支持還要這個(gè)干嗎?有可能子類(lèi)中不想支持父類(lèi)中有的方法,可以直接拋出這個(gè)異常。
7、ArithmeticException:算術(shù)錯(cuò)誤,典型的就是0作為除數(shù)的時(shí)候。
8、IllegalArgumentException:非法參數(shù),在把字符串轉(zhuǎn)換成數(shù)字的時(shí)候經(jīng)常出現(xiàn)的一個(gè)異常,我們可以在自己的程序中好好利用這個(gè)異常。
總結(jié)
以上是生活随笔為你收集整理的java runtime 异常_Java中RuntimeException和Exception的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 颐和园什么时候去比较好
- 下一篇: 《楚乔传》宇文玥真实身世如何 亲生父母是