異常和錯誤之間的區(qū)別
首先,我們需要了解異常和錯誤之間的區(qū)別
- Error表示系統(tǒng)致命的錯誤计呈,程序是無法處理這些錯誤的砰诵,即:Error類是指與JVM相關(guān)的問題,比如:系統(tǒng)崩潰捌显,虛擬機錯誤茁彭,內(nèi)存溢出等
- Exception是指程序可以捕獲并處理的異常,并且程序可能會被恢復(fù)扶歪。
異常又分為運行時異常
和編譯時異常
異常繼承體系 |
---|
運行時異常一般都屬于程序員犯錯 |
其它都是編譯時異常理肺,編譯時就會報錯 |
異常的處理方法
1、交給jvm處理
JVM異常處理方式 |
---|
java收到問題時有兩種處理方式1.自己處理善镰,然后繼續(xù)運行(后面會介紹)2.自己沒有辦法處理妹萨,交給jvm來處理 |
JVM有一個默認的異常處理機制將異常處理 |
并將該異常的名稱,異常信息炫欺,異常出現(xiàn)的位置給打印在控制臺上乎完,同時停止運行 |
例:
public static void main(String[] args) {
int a = 10 / 0;
System.out.println(a)品洛;
}
10/0違背了算法運算法則树姨,拋出異常。
拋出的異常是一個對象桥状,New ArithmeticException(“/by zero”) 把這個異常對象返回帽揪。 此時想把異常對象賦值給a。
a是一個int類型不能接收辅斟,main方法解決不了转晰。交給jvm來處理,jvm就將該異常在控制臺打印程序終止士飒。
2查邢、自己處理
自己 處理異常兩種方式 |
---|
1.try…catch…finally |
2.throws |
try..catch處理異常的基本格式
try{
可能出現(xiàn)理異常的代碼
}catch(異常類型){
}finally{
處理完異常最后做的處理
}
- Try:用來檢測異常
- Catch:用來捕獲異常
- Finally:釋放資源
例:
public static void main(String[] args) {
try {
int a = 10 / 0;
System.out.println(a);
} catch (ArithmeticException a) {
System.out.println("除數(shù)不能為0!");
}
}
10/0;會創(chuàng)建一個異常對象New ArithmeticException(“/by zero”)变汪。
賦值給a,接收不了蚁趁,此時就把異常對象傳給catch當(dāng)中的參數(shù)a裙盾。
能夠接收,就會執(zhí)行catch當(dāng)中的內(nèi)容,程序也沒有終止番官。
public void setAge(int age) throws {
if(age > 0 && age <= 150){
this.age = age;
}else {
// 自己手動拋出一個運行時異常
throw new RuntimeException("年齡非法");
}
}
拋出了一個編譯時異常庐完,必須得要有人處理。如果不處理徘熔,必須繼續(xù)往上拋门躯,拋給方法調(diào)用者。
此時由于setAge內(nèi)部拋出了一個異常酷师,在調(diào)用該方法時必須得要處理讶凉,如果不處理就會報錯。還有一種方法自己不處理山孔,繼續(xù)往上拋出懂讯。
即:
此時自己沒有去處理,又往上拋出台颠,給了main方法褐望。
main方法的調(diào)用者是jvm,jvm內(nèi)部有一個異常處理,會把異常信息打印在控制臺上串前,終于程序執(zhí)行瘫里。
常見的異常類型
-
ArithmeticException
數(shù)學(xué)運算異常
int a = 10 / 0;
System.out.println(a)荡碾;
-
ArrayIndexOutOfBoundsException
數(shù)組下標(biāo)越界異常
//定義數(shù)組的長度為2 但是查找的是第三4個所以會出現(xiàn)數(shù)組下標(biāo)越界異常
int[] a = new int[2];
System.out.println(a[3]);
-
NumberFormatException
字符串轉(zhuǎn)換為數(shù)字異常
String str = "123a2";
int a = Integer.valueOf(str);
System.out.println(a);
-
ClassCastException
數(shù)據(jù)類型轉(zhuǎn)換異常
// 當(dāng)試圖將對某個對象強制執(zhí)行向下轉(zhuǎn)型谨读,但該對象又不可轉(zhuǎn)換又不可轉(zhuǎn)換為其子類的實例時將引發(fā)該異常
Object object = new Object();
String str = (String) object;
-
NullPointerException
空指針異常
// 當(dāng)給字符串一個null才會出現(xiàn)空指針異常
String str = null;
if (str.equals(null)) {
System.out.println("我是空指針異常");
}
-
ClassNotFoundException
指定的類不存在
這里主要考慮一下類的名稱和路徑是否正確即可,通常都是程序試圖通過字符串來加載某個類時可能引發(fā) 異常
-
IllegalArgumentException
方法的參數(shù)錯誤
舉個例子:getUser(int username)方法玩荠,不允許傳入空字符串或者null漆腌。但是有個調(diào)用的方法,沒做檢查阶冈,傳入了null或者空字符串闷尿,這時候getUser方法就應(yīng)該要拋出IllegalArgumentException告訴調(diào)用者:hi!這個參數(shù)不能為empty或者null女坑。
-
IllegalAccessException
沒有訪問權(quán)限
當(dāng)應(yīng)用程序要調(diào)用一個類填具,但當(dāng)前的方法即沒有對該類的訪問權(quán)限便會出現(xiàn)這個異常。對程序中用了Package的情況下要注意這個異常.