1. 程式人生 > 實用技巧 >Python自動化:pubmed實現自動搶票、雙十一搶貨

Python自動化:pubmed實現自動搶票、雙十一搶貨

異常

異常的根類是java.lang.Throwable,其包括ErrorException兩個子類。Error我們不能解決,如記憶體溢位等。但是Exception可以避免(編譯異常、執行時異常等)。

try、catch、finally、throw、throws

throw丟擲異常

應用於方法內,如:用if語句判斷是否超過索引,如果是就丟擲異常:

throw new ArrayIndexOutOfBoundsException("陣列越界");

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        int index = 10;
        if (index >= 4) {
            throw new ArrayIndexOutOfBoundsException("陣列越界");
        } else {
            System.out.println(arr[index]);
        }
    }
}

throws宣告異常

應用於方法之上,格式:public void method() throws XxxException {}

  • 如果方法內部有丟擲異常,throws後面必須宣告。
  • 聲明瞭異常,要麼繼續拋給方法的呼叫者,要麼交給tray{}catch
public class Test {
    public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
        int[] arr = {1, 2, 3, 4};
        int index = 10;
        if (index >= 4) {
            throw new ArrayIndexOutOfBoundsException("陣列越界");
        } else {
            System.out.println(arr[index]);
        }
    }
}

try..catch捕獲異常

如果不throws異常,那麼可以捕獲異常,自己處理。一般在工作中,會把異常資訊記錄在日誌。

  • catch可以有多個,不能重複,子異常先與父異常處理。
public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4};
        int index = 10;
        try {
            System.out.println(arr[index]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("陣列越界");
            System.out.println(e.getMessage()); // 簡短描述
            System.out.println(e.toString());      // 詳細描述
            e.printStackTrace();      // 最全面資訊
        }
        System.out.println("後續程式碼也會執行");
    }
}

子類繼承父類時,對丟擲異常的處理:

  • 父類有丟擲異常,子類可以丟擲相同的異常,或者丟擲子異常,或者不丟擲;
  • 父類沒有丟擲異常,子類也可以丟擲,但必須捕獲。

自定義異常類

需要繼承兩個類:

  • java.lang.Exception編譯異常,要麼trows,要麼try{}catch
  • java.lang.RuntimeException執行異常,交給虛擬機器處理

例子:模擬註冊,如果使用者存在,則丟擲異常

import java.util.*;

public class Test {
    static String[] usernames = {"張三", "李四", "王五"};

    public static void main(String[] args) {
        System.out.println("請輸入您要註冊的使用者名稱: ");
        Scanner sc = new Scanner(System.in);
        String username = sc.next();
        check(username);
    }

    public static void check(String username) {
        for (String name : usernames) {
            if (name.equals(username)) {
                try {
                    throw new MyException("使用者名稱已註冊!!!");
                } catch (MyException e) {
                    e.printStackTrace();
                    return; // 結束
                }
            }
        }
        System.out.println("恭喜您,註冊成功!");
    }

}

class MyException extends Exception {
    public MyException() {
    }

    public MyException(String message) {
        super(message);
    }
}