異常

1.異常是什么?

異常就是在本該順理成章的地方發(fā)生了出乎意料的事情,這個“事情”就是異常。處理和解決這個事情,就是處理異常。

舉例:

光頭強像往常一樣去砍樹,突然發(fā)現刀沒了。但是刀一直放在那個墻角啊,怎么會沒了呢(異常)?最后只能去集市上買一把了,結果發(fā)現灰太狼在賣刀,才明白是灰太狼偷了他的刀(明白異常發(fā)生的原因)。還把灰太狼打了一頓,甚是高興。(解決了bug,當然異常高興)

2.異常的父類?

Object-->Throwable-->Exception -->運行時異常(RuntimeException)
                               -->檢查類異常(CheckedException)
                  -->Error及其子類只能用來處理系統內部程序的異常和運行環(huán)境的異常,一般與硬件有關

解釋:
異常可以分為Exception和Error兩大類,它們的父類都是Throwable,而Exception又可以分為RuntimeException和CheckedException兩大類

3.常出現的異常

  1. ArithmeticException
  2. ArrayIndexOutOfBoundException
  3. NullPointerException
  4. ClassNotFindExceotion
  5. IIIegalArgumentException
  6. ClassCastException
  7. 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ū)別?

  1. 聲明異常: throws,聲明異常后需要在調用方法時,捕獲異常
  2. 拋出異常: throw

4.為什么為方法添加聲明異常

如果當前方法出錯,將會影響后續(xù)程序的執(zhí)行,如果不想影響,需要提前給方法聲明異常,使用時提示捕獲異常。

5.拋出異常的意義

可以終止程序的允許,如果當前方法無法完成,后續(xù)操作也無須執(zhí)行。但是拋出異常后,后續(xù)程序可以運行

6.處理異常的優(yōu)點:

增加程序的健壯性

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容