java 異常處理是什麼?

異常的種類

異常處理
Throwable (異常處理父類)

Error 系統崩潰 數據庫崩潰(跟咱們代碼沒關係)

Exception 異常(是跟咱們代碼有關係的)

RuntimeException 運行時異常

如何解決

出現異常 系統如何解決?(誰來解決)

main函數解決方式

1.main函數自己解決

2.把問題跑出上級去解決(誰調用的main 誰去解決)

交給jvm虛擬機解決 給你報錯

打印錯誤信息 錯誤發生在什麼類的 什麼位置

舉3個常見的異常

public static void main(String[] args) {
        /*
         * 需求 
         * 1.空指針異常
         * 2.角標越界異常
         * 3.算術異常
         */
        ArrayList<String> arrayList = new ArrayList<>();
        Iterator<String> iterator = arrayList.iterator();


       // 角標越界
//      System.out.println(arrayList.get(2));
//       
        //算術異常
//      System.out.println(2/0);
        //空指針異常(訪問一塊不屬於你的內存空間)
        arrayList = null;
        System.out.println(arrayList.get(2));

    }

異常解決方式

try….catch …. finally
try 指測試這個異常

catch 指捕獲這個異常

finally 指異常結束後做的事

捕獲異常流程

1.發生異常

2.根據發生的異常 產生 對應的異常對象

3.這個 異常對象 會返回給調用者

4.如果調用者處理了這個異常(添加try…catch)

異常對象會跟catch進行匹配 匹配上執行catch中語句

程序會繼續執行

5.如果調用者沒有處理這個異常 默認交給jvm去處理

根據 產生異常對象 打印對應錯誤信息

程序停止

具體過程

public class Demo02 {
    public static void main(String[] args) {
        TestException testException  = new TestException();
        try {
            //可能發生異常的代碼
            int num = testException.fun(10,0);
            // 這塊反饋了一個對象
            // new ArithmeticException("/by zero")
            System.out.println(num);
        }catch (ArithmeticException e) {
            //捕獲異常該咋辦
            // catch 如何就能捕獲異常
            // ArithmeticException e = new ArithmeticException("/by zero")
            // catch 會匹配這個異常對象
            // 如果匹配上了 就執行 catch 中的語句
            // 捕獲異常後 程序會繼續執行
            System.out.println("吃藥了沒 ?除數爲0");
        }
                System.out.println("你猜我執行了嗎");
    }

}
class TestException{
    //報異常方法
    public int fun(int a , int b) {
        /*
         * 這裏發生了算術異常
         * 相當於產生了一個異常對象
         * new ArithmeticException("/by zero")
         * 一旦發生異常 系統會產生一個對應的異常對象
         * 發生異常後 誰用我 這個異常就給誰
         * 處理不了 就給jvm虛擬機處理
         *  打印錯誤信息(根據異常對象的類型 去打印錯誤信息
         *  )
         *  然後打印完 會結束你的程序
         * 
         */
        return a/b;
    }
}

多異常

多catch的 捕獲異常

異常處理的作用 :幫你來完善代碼 讓你出現的錯誤 更容易找到

java

安卓開發 客戶端開發 處理異常 一般直接用 Exception處理

javaEE開發

服務器開發 處理異常 打印錯誤信息 你帶嗎的錯誤會被隱藏掉

一般會做日誌處理(記錄程序被訪問的日誌) log4j

public static void main(String[] args) {
        int[] array = {1,2,3,4};
        try {
            //測試代碼異常

            System.out.println(10/0);
            // 產生 new ArithmeticException()
            // 匹配
            // 匹配成功後 程序繼續向下執行
            System.out.println(array[10]);
        }catch (ArithmeticException e) {
            /*
             * 注意:如果使用Exception 直接匹配異常
             * 多個catch 同時捕獲時需要寫在最後
             * 寫前面後面的catch相當於白加了
             */
            System.out.println("病了治 除數爲0");
        }catch (Exception e) {
            //如果發生多個異常 需要匹配 多個Catch

            System.out.println("你出錯了");
        }

        System.out.println("猜猜我執行了嗎");
    }

finally

finally(遺言)

記住 不管你異常有沒有發生 有沒有被匹配到都會執行

finally 有什麼作用?

可以關閉 系統資源避免資源浪費

(列如 關閉 輸入流 和關閉數據庫)

final finally finalize 有什麼區別

雷鋒和雷鋒塔 沒什麼練習

final 修飾類 修飾方法 修飾屬性

finally 中語句一定會執行(異常處理的語句)

finalize 基類Object類中的方法

所有java對象中都有這個方法

該方法 在垃圾回收時候 被系統自動調用

當一塊內存空間 無人引用 這塊內存就是垃圾

    public static void main(String[] args) {
        try {
            System.out.println(10/1);
            return;
        } catch (ArithmeticException e) {
            System.out.println("除0了");

        }finally {
            System.out.println("你看我執行了嗎");
        }
        System.out.println("我是下面的語句"); 

    }

運行異常 和 編譯異常的區別

運行時異常 和編譯時異常

除了運行時異常 就是編譯時異常

運行時異常—-代碼問題(程序員反的錯)

出現編譯時異常 —–問題的提前預警 強制你去處理

不處理 編譯不通過

    public static void main(String[] args) throws FileNotFoundException {
        // 編譯異常
        // 系統這時候 不知道你到底有沒有這個文件
        // 相當於系統問你 要是沒有這個文件怎麼辦
        // 系統這時會強制 要求你對這個問題作出解釋
        // 這就是編譯時異常
        // 編譯時異常相當於 對問題的一種提前準備
        /*
         * 解決異常有兩種方式
         * 1.自己處理 try。。。。catch(想讓程序繼續執行就 try)
         * 2.把異常跑出去(誰調用 我 跑給誰 誰去處理)
         * (先讓程序遇到錯誤就停止 就拋)
         */

//      try {
//          FileInputStream fs  =  new FileInputStream("wl.txt");
//      } catch (Exception e) {
//          System.out.println("讀入文件沒找到");
//      }


    }

自定義異常方法

// 創建一個自定義 異常類
// 在創建異常類 時 需要直觀讓人知道這是什麼異常
// 所以類名 要見名知意
class ageOutOfBoundsException extends Exception{
    /**
     * 序列化 時 需要 id
     */
    //重寫構造方法
    public ageOutOfBoundsException() {
        super();
        // TODO Auto-generated constructor stub
    }

    public ageOutOfBoundsException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }


}

public class Person {
    private String name;
    private int age;
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    // 如果這個方法 要拋出異常 給調用者
    // 那麼 必須在方法聲明上標識這個方法 爲異常方法
    // throws Exception 標識是拋出什麼異常
    /*
     * throw 和 throw 區別
     * throws標識 這個方法 可以拋出一個異常
     * (在方法的聲明出現)
     * throw 拋出一個異常對象(方法中出現)
     */
    public void setAge(int age) throws Exception {
        if(age>0&&age<120) {
        this.age = age;
        }else {
//          System.out.println("還是人嗎");
            // 拋出一個異常 告訴他 你賦值的年齡不對
            // throw  關鍵詞 跑出一個異常對象
            // 創建一個異常對象
//          Exception exception = new Exception("年齡非法");
            // 把這個異常對象拋出去
            // 拋給誰 誰用就跑給誰
            // 使用匿名對象拋出
            //使用自定義類處理異常
            ageOutOfBoundsException e = new ageOutOfBoundsException("年齡非法");
            throw e ;
        }
    }
    public Person(String name, int age) {
        super();

        this.name = name;
        this.age = age;



    }
    public Person() {
        super();
    }



}

Throwable中的方法

      Exception e = new  Exception("HAHA ");
        //調用 異常類中toString 方法
        // 打印的異常類名 和異常信息
        System.out.println(e);
        // 只打印異常信息
        System.out.println(e.getMessage());
        // 打印的時異常類名 信息加出現的位置
        // jvm虛擬機 默認打印的就是這個方法
        e.printStackTrace();

例題

無線輸入整數 存放到集合中 打印 輸入quit停止

希望在輸入字符串的時候 讓程序爺能繼續運行

public static void main(String[] args) {


        ArrayList<Integer> arrayList = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);
        String num="";
        while (true) {
         num = scanner.next();

            if(num.equals("quit")) {
                break;
            }
          try {
              int num1 =Integer.parseInt(num);
              arrayList.add(num1);
            } catch (NumberFormatException e) {
                System.out.println("請輸入數字 或者 quit");

            }



        }
        for (Integer string : arrayList) {
            System.out.println(string);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章