1.異常是什么?
異常就是在本該順理成章的地方發(fā)生了出乎意料的事情,這個“事情”就是異常。處理和解決這個事情,就是處理異常。
舉例:
光頭強像往常一樣去砍樹,突然發(fā)現刀沒了。但是刀一直放在那個墻角啊,怎么會沒了呢(異常)?最后只能去集市上買一把了,結果發(fā)現灰太狼在賣刀,才明白是灰太狼偷了他的刀(明白異常發(fā)生的原因)。還把灰太狼打了一頓,甚是高興。(解決了bug,當然異常高興)
2.異常的父類?
Object-->Throwable-->Exception -->運行時異常(RuntimeException)
-->檢查類異常(CheckedException)
-->Error及其子類只能用來處理系統內部程序的異常和運行環(huán)境的異常,一般與硬件有關
解釋:
異常可以分為Exception和Error兩大類,它們的父類都是Throwable,而Exception又可以分為RuntimeException和CheckedException兩大類
3.常出現的異常
- ArithmeticException
- ArrayIndexOutOfBoundException
- NullPointerException
- ClassNotFindExceotion
- IIIegalArgumentException
- ClassCastException
- NumberFormatException
代碼:
package 異常;
public class ExceptionTest {
public static void main(String[] args) {
int num = 5 / 0;
System.out.println(num);
}
}
測試結果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at 異常.ExceptionTest.main(ExceptionTest.java:12)
注意:當出現異常之后,后面代碼不可被執(zhí)行
4.處理異常的方法
1.
try {
} catch() {
//先子類,后父類
//只執(zhí)行第一個成功匹配的異常
}
2.
try{
}catch(){
}fianlly{
//不管有沒有異常都會被執(zhí)行
System.exit(-1)
}
3. 只有System.exit(-1);finally才不會執(zhí)行,其他情況都會執(zhí)行,即使在finally之前定義了return
測試代碼:
package 異常;
public class Test {
public static void main(String[] args) {
int[] a = {};
System.out.println(a[0]);
}
}
測試結果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at 異常.Test.main(Test.java:8)
測試2(使用try catch finally)
package 異常;
public class Test {
public static void main(String[] args) {
try {
int[] a = {};
System.out.println(a[0]);
} catch (Exception e) {
System.out.println("數組為空");
} finally {
//除非System.in(-1),finally才不會被HI行
System.out.println("始終會被執(zhí)行");
}
}
}
測試結果:
數組為空
始終會被執(zhí)行
5.捕獲異常的過程
當代碼產生異常后,系統會自動創(chuàng)建一個異常對象,如果系統創(chuàng)建的異常對象和catch(異常對象)中的異常對象一致,就會執(zhí)行catch中的內容
代碼測試:
package 異常;
public class ExceptionTest {
public static void main(String[] args) {
try {
int num = 5 / 0;
System.out.println(num);
} catch (NullPointerException e) {
System.out.println("出錯了");
}
}
}
測試結果:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at 異常.ExceptionTest.main(ExceptionTest.java:7)
總結:從上可以看出,如果捕獲的異常不匹配,結果還是會報異常
注意:在try里面,一旦異常發(fā)生,后面的部分代碼就不再執(zhí)行。
6.為當前項目創(chuàng)建自己獨有的異常類型
創(chuàng)建一個自己的異常類,繼承自IllegalArgumentException異常類
package 異常;
public class AgeOverException extends IllegalArgumentException{
//構造方法
public AgeOverException(){}
public AgeOverException(String msg){
super(msg);
}
}
測試類
package 異常;
public class Student {
private int age;
public int getAge() {
return age;
}
//聲明異常
public void setAge(int age) throws Exception{
if (age > 0 && age < 100) {
this.age = age;
} else {
//拋出異常
throw new AgeOverException("用戶輸入的年齡不對");
}
}
public static void main(String[] args) throws Exception {
Student s = new Student();
s.setAge(120);
}
}
測試結果:
Exception in thread "main" 異常.AgeOverException: 用戶輸入的年齡不對
at 異常.Student.setAge(Student.java:17)
at 異常.Student.main(Student.java:23)
7.其他問題
1.什么是檢查異常
檢查異常:如果當前的方法在運行時可能會出現異常,那么我們就需要聲明異常,以便于在調用的時候捕獲異常。防止程序中斷。
2.什么是運行時異常
運行時異常:運行時產生的錯誤
3.聲明異常和拋出異常的區(qū)別?
- 聲明異常: throws,聲明異常后需要在調用方法時,捕獲異常
- 拋出異常: throw
4.為什么為方法添加聲明異常
如果當前方法出錯,將會影響后續(xù)程序的執(zhí)行,如果不想影響,需要提前給方法聲明異常,使用時提示捕獲異常。
5.拋出異常的意義
可以終止程序的允許,如果當前方法無法完成,后續(xù)操作也無須執(zhí)行。但是拋出異常后,后續(xù)程序可以運行
6.處理異常的優(yōu)點:
增加程序的健壯性