1. 程式人生 > 其它 >10.Java異常機制

10.Java異常機制

1、什麼是異常(Exception)

  • 異常是指程式執行中出現得不期而至得各種狀況。如:檔案找不到、網路連線失敗、非法引數等待

2、異常體系結構

一、要理解java異常處理是如何工作得,需要掌握以下三種情況

  • 檢查性異常:最具代表性得檢查性異常是使用者錯誤或者問題引起得異常,這是程式設計師無法預見得。例如要開啟一個不存在得檔案時,一個異常就發生了,這些異常在編譯時不能被簡單得忽略。

  • 執行時異常:執行時異常是可能被程式設計師避免得異常。於檢查性異常相反,執行時異常可以在編譯時被忽略

  • 錯誤(ERROR):錯誤不是異常,而是脫離程式設計師控制得問題。錯誤在程式碼中通常被忽略。例如,當棧溢位時,一個錯誤就發生了,他們在編譯也檢查不到。

二、java把異常當作物件處理,並定義一個基類java.lang.Throwable,其結構如下:

  • Error類物件是由java虛擬機器生成並丟擲,大多數錯誤與程式碼編寫者所執行的操作無關。
  • Exception類物件一般由程式邏輯錯誤引起,程式應該從邏輯角度儘可能避免。

3、java異常處理機制

一、丟擲異常

當異常發生時,java虛擬機器會自動丟擲異常並給與提示,也可以通過throw、throws主動丟擲異常

  • throw:
    • 表示方法內丟擲某種異常
    • 如果異常物件是非RuntimeException,則需要在方法體上加上throws丟擲該異常,或者在方法體內用try、catch處理該異常,否則編譯報錯
    • 執行到throw語句則後面的語句不再執行
  • throws:
    • 在方法體上使用,表示這個方法可能丟擲某種異常
    • 需要由方法的呼叫著進行異常處理
package com.exception;

import java.io.IOException;

public class Test1 {
    public static void main(String[] args) {
        try {
            testThrows(1,0);
        }catch (ArithmeticException e){
            System.out.println("Throws丟擲異常");
        }

        try {
            testThrow(1,0);
        }catch (ArithmeticException e){
            System.out.println("Throw關鍵字丟擲執行時異常,不需要在方法體上宣告");
        }
        
        String filePath = null;
        try{
            testThrow(filePath);
        }catch (IOException e){
            System.out.println("Throw關鍵字丟擲非執行時異常,需要在方法體加throws異常丟擲宣告");
        }


    }
    //測試Throws關鍵字
    public static void testThrows(int a,int b) throws ArithmeticException{
        System.out.println(a/b);
    }

    //測試Throw關鍵字丟擲執行時異常
    public static void testThrow(int a,int b) {
        if (b == 0){
            throw new ArithmeticException();//執行時異常不需要在方法體上宣告
        }
    }

    //測試Throw關鍵字丟擲非執行時異常,需要在方法體加throws異常丟擲宣告
    public static void testThrow(String filePath) throws IOException {
        if (filePath == null){
            throw new IOException();//執行時異常不需要在方法體上宣告
        }
    }
}

二、捕獲異常

可以通過try、catch、finally關鍵字對異常進行捕獲、處理。

package com.exception;

public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //捕獲多個異常:異常的型別必須是從小到大捕獲
        try {//try監控區域
            System.out.println(a/b);
        }catch (Error e){//catch後跟想要捕獲地異常型別
            System.out.println("程式出現錯誤");
        }catch (Exception e){
            System.out.println("程式出現異常,除數不能為零");
        }catch (Throwable t){
            System.out.println("程式出現異常或者錯誤");
        }
        finally {//不管有不有異常發生都會被執行
            System.out.println("finally");
        }
    }