Java--異常處理

BtWangZhi發表於2017-12-16
  1. 當程式執行出現意外情況時,系統會自動生成一個Exception物件來通知程式,從而實現將業務處理程式碼和異常處理程式碼分離,提供更好的可讀性。

  2. return和finally
    2.1

public class TextMain {
    public static void main(String[] args) {
        System.out.println("返回值:"+test01());
    }
    public static Integer test01() {
        User user = null;
        try {
            System.out.println(user.getName());
            System.out.println("出現錯誤後");
            return 1;
        } catch (NullPointerException e) {
            System.out.println("執行異常資訊輸出");
            System.out.println(e.getMessage());
            //System.exit(1);
            return 2;
        } finally {
            System.out.println("執行 Finally");
        }
    }
}
class User {
    private String name;
    public String getName() {
        return name;
    }
}

這裡寫圖片描述
finally被用來強制在return之前執行需要被執行的程式碼,如上程式碼中,在異常處理中的最後新增return語句,還是在return執行之前執行了finally中的程式碼。
除非出現退出虛擬機器的情況。開啟如上程式碼中的註釋。控制檯輸出如下:
這裡寫圖片描述
退出虛擬機器後就不存在執行程式碼這個的說法。
2.2

public class TextMain {

    public static void main(String[] args) {
        System.out.println("返回值:"+test01());
    }
    public static Integer test01() {
        User user = null;
        try {
            System.out.println(user.getName());
            System.out.println("出現錯誤後");
            return 1;
        } catch (NullPointerException e) {
            System.out.println("執行異常資訊輸出");
            System.out.println(e.getMessage());
            //System.exit(1);
            return 2;
        } finally {
            System.out.println("執行 Finally");
            return 3;
        }
    }
}
class User {
    private String name;

    public String getName() {
        return name;
    }
}

這裡寫圖片描述
當程式在try、catch中如果執行到return、throw語句,將會去檢視當前異常處理流中是否包含finally語句,如果包含會去執行finally語句,沒有執行的話會直接執行,但是有的話會進入finally中執行,如果在finally中包含return或者throw語句,將不會跳轉到try、catch中的return、throw語句。
結論:儘量不要在finally中使用return或者throw語句。

  1. 自定義異常
    自定義異常都應該繼承Exception基類,如果希望自定義Runtime異常,應該繼承RuntimeException基類。定義的異常類應該包含兩個構造器,一個是無引數的構造器,一個是帶字串引數的構造器,這個引數將作為異常物件的描述資訊。
    自定義異常:
public class AuctionException extends Exception {

    public AuctionException() {
    };

    public AuctionException(String msg) {
        super(msg);
    }
}

使用自定義的異常:

public class AuctionTest {
    public static void main(String[] args) {
        try {
            bid();
        } catch (AuctionException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void bid() throws AuctionException {
        try {
            System.out.println(1 / 0);
        } catch (Exception e) {
            e.printStackTrace();
            throw new AuctionException("執行錯誤");
        }
    }
}

cache和throw同時使用,捕獲異常記錄異常資訊,同時丟擲異常資訊給呼叫者處理。

處理異常的原則:
1 不要忽視異常,能在當前方法中處理,不能就throw拋給呼叫者處理
2 異常鋪貨時,應該先鋪貨小異常,再捕獲大異常。
部分摘自瘋狂英語。

3 unchecked異常和checked異常

public class TestMain {
    public static void main(String[] args) {
        try {
            //checked異常
            throw new CheckedGenericException("checked exception");
        } catch (CheckedGenericException e) {
            e.printStackTrace();
        }
        //Unchecked異常
        throw new UnCheckedException("unchecked exception");
        //throw new NullPointerException("not checked exception");
    }

    public static class CheckedGenericException extends Exception {
        private static final long serialVersionUID = 1L;

        public CheckedGenericException() {
        }

        public CheckedGenericException(String msg) {
            super(msg);
        }
    }

    public static class UnCheckedException extends RuntimeException {
        private static final long serialVersionUID = 1L;

        public UnCheckedException() {
        }

        public UnCheckedException(String msg) {
            super(msg);
        }
    }
}