1. 程式人生 > 其它 >P1451 求細胞數量

P1451 求細胞數量

什麼是異常

  • 實際工作中,遇到的情況不可能是非常完美的。如:輸入不合法,開啟檔案不存在。
  • 軟體程式在執行的過程中,非常可能遇到一些問題,我們稱之為異常(Exception,例外)。
  • 異常指程式執行出現的不期而至的各種狀況,如:檔案找不到、網路連線失敗、非法引數等。
  • 異常發生在程式執行期間,它影響了正常的程式執行流程。

簡單分類

需要了解以下三種異常:

  • 檢查性異常:最具有代表的檢查性異常是使用者錯誤或問題引起的異常,這是程式設計師無法預見的。如:開啟一個不存在的檔案。
  • 執行時異常:執行時異常是可能被程式設計師避免的異常,與檢查性異常相反,執行時異常可以在編譯時被忽略。
  • 錯誤ERROR:錯誤不是異常,而是脫離程式設計師控制的問題。錯誤再程式碼中通常被忽略。例如:當棧溢位了,一個錯誤就發生了,它們在編譯也檢查不到的。

異常體系結構

  • Java把異常當作物件來處理,並定義一個基類java.lang.Throwable作為所有異常的超類。
  • 在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception。

Error

【錯誤】表示 java 程式在執行時產生的無法處理的故障(如堆疊溢位),錯誤出現時會導致程式無法正常執行並強制退出。通常由java虛擬機器生成並丟擲,大多數錯誤與程式碼編寫者所執行的操作無關。

Exception

  • 在異常分支中有一個重要的子類RuntimeException(執行時錯誤)

    表示 java 程式執行狀態中發生的異常,在編譯時無法被檢測。在 java 程式執行時會由系統自動丟擲,允許應用程式不進行處理。

    異常型別 介紹
    ArithmeticException 算術異常,以零做除數
    ArrayIndexOutOfBoundException 陣列越界異常
    NullPointerException 空指標異常,物件不存在
    MissingResourceException 丟失資源
    ClassNotFoundException 找不到類
  • 這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生;

  • Error和Exception的區別:Error通常是災難性的致命的錯誤,是程式無法控制和處理的,當出現這些異常時,Java虛擬機器(jvm)一般會選擇終止執行緒;Exception通常情況下是可以被程式處理的,並且在程式中應該儘可能的去處理這些異常。

異常處理機制

  • 丟擲異常
  • 捕獲異常
  • 異常處理五個關鍵字
    • try、catch、finally、throw、throws
public class Test {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;
        try{//try監控區域
            System.out.println(a/b);
        }catch (ArithmeticException e){//catch(想要捕獲的異常型別) 捕獲異常
            System.out.println("程式異常,被除數不能為0!");
        }finally {//處理善後工作
            System.out.println("結束");
        }
    }
    //try、catch一定要有,finally可以沒有
    //假設IO資源的關閉,需要用finally。
    //多個catch時要層層遞進,最大的異常在最後。
}
  • idea快捷鍵,ctrl + alt + t。
  • throw 語句:開發者自行建立異常物件並丟擲,等待程式進行異常處理。
  • throws 語句:宣告方法可能丟擲某種異常且未經處理,呼叫該方法的上級需要進行異常處理。
public class Test2 {
    public static void main(String[] args) {
        test(1,0);
    }
    public static void test(int a, int b){
        if(b==0){
            throw new ArithmeticException();//主動丟擲異常,一般在方法中使用。main方法捕獲異常即可
        }
        System.out.println(a/b);
    }
}

自定義異常

  • 使用Java內建的異常類可以描述在程式設計時出現的大部分異常情況。初次之外,使用者還可以自定義異常。使用者自定義異常類,只需要繼承Exception類即可。

  • 在程式使用自定義異常類,大體可分為以下幾個步驟:

    1. 建立自定義異常類。
    2. 在方法中通過throw關鍵字丟擲異常物件。
    3. 如果在當前丟擲異常的方法中處理異常,可以使用try-catch語句捕獲並處理;否則在方法的宣告處通過throws關鍵字指明要丟擲給方法呼叫者的異常,繼續進行下一步操作。
    4. 在出現異常方法的呼叫者中捕獲並處理異常。
public class MyException extends Exception{
    //傳遞數字10;
    private int detail;

    public MyException(int a) {
        this.detail = a;
    }

    public MyException(String message) {
        super(message);
    }
    //toString:異常的列印資訊。
    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}
public class Test {
    //可能會存在異常的方法
    static void test(int a) throws MyException {
        if(a>10){
            //增加一些處理異常的程式碼塊,將損失降到最小。
            throw new MyException(a);
        }
        System.out.println("OK");
    }

    public static void main(String[] args) {
        try {
            test(11);
        } catch (MyException e) {
            System.out.println(e);
        }
    }
}

實際應用的經驗總結

  • 處理執行時異常,採用邏輯去合理規避同時輔助try-catch處理
  • 再多重catch塊後面,可以加一個catch(Exception)來處理可能會被遺漏的異常
  • 對於不確定的程式碼,也可以加上try-catch,處理潛在的異常
  • 儘量去處理異常,切忌只是簡單的呼叫列印輸出。
  • 具體如何處理異常,要根據不同的業務需求和異常型別去決定。
  • 儘量新增finally語句塊去釋放佔用的資源。IOScanner