1. 程式人生 > 其它 >菜雞的Java學習筆記——異常和異常處理

菜雞的Java學習筆記——異常和異常處理

技術標籤:Java

# Java學習筆記——異常和異常處理

  • Throwable:Error,Exception
  • Exception:RuntimeException(非檢查異常),檢查異常
  • RuntimeException:NullPointerException(空指標異常),ArrayIndexOutOfBoundsException(陣列下標越界異常),ClassCastException(型別轉換異常),ArithmeticException(算數異常)
  • 檢查異常:IOException(檔案異常),SQL異常(SQLException),需要手動新增捕獲以及處理語句。

## 處理異常

try-catch

try{
    //一些會丟擲異常的方法
}catch(Exception e){
    //處理該異常的程式碼塊
}

如果丟擲異常,則終止程式,程式的控制權將被轉移交給catch塊中的異常處理程式,可以發出警告,也可以進行錯誤日誌記錄,下面的例子對錯誤進行警告處理

try{
    System.out.print("請輸入您的年齡:");
    Scanner input = new Scanner(System.in);
    int age = input.nextInt();
    System.out.println("十年後您"
+ (age + 10) + "歲"); }catch(InputMismatchException e){ System.out.println("請輸入整數!"); } System.out.println("謝謝使用!");

輸入小數,執行結果

image.png

如果丟擲很多型別的異常,需要用到多重catch塊

try{
    //一些會丟擲異常的方法
}catch(Exception e){
    //處理異常Exception的方法
}catch(Exception2 e){
    //處理異常Exception2的方法
}...(n個catch
)...{ }

下面的例子可能出現兩種異常,針對每種異常分別處理

try{
    Scanner input = new Scanner(System.in);
    System.out.print("請輸入第一個數:");
    int a = input.nextInt();
    System.out.print("請輸入第二個數:");
    int b = input.nextInt();
    System.out.println("兩數相除結果是:" + a / b);
}catch(InputMismatchException e){
    //e.printStackTrace();//列印異常
    System.out.println("請輸入整數!");
}catch(ArithmeticException e){
    System.out.println("除數不能為0!");
}

執行結果

image.png

image.png

在catch異常時,要按照子類-父類的順序進行檢測,在上面的例子中,InputMismatchException異常必須在ArithmeticException異常的前面,否則編譯器會報錯

try-catch-finaly

用於最終將要執行的程式碼,進行“善後工作”

try{
    //一些會丟擲異常的方法
}catch(Exception e){
    //處理異常Exception的方法
}catch(Exception2 e){
    //處理異常Exception2的方法
}...(n個catch)...{

}finally{
    //最終要執行的一些程式碼
}

## 異常丟擲

throw——將產生的異常丟擲(動作)
throws——宣告將要丟擲何種型別的異常(宣告)

public void divide(int a, int b) throws Exception{
    if(b == 0)//出現異常
        throw new Exception("除數不能為0!");//向上級報告
    else
        System.out.println("相除結果為:" + a /b);
}

## 自定義異常

藉助於Java現存的異常型別,例如Exception,自定義異常要繼承Exception類或者其子類 public class 異常名 extends Exception

例子:在圖書查詢系統中,若查詢的書不存在,則出現BooknotExistException異常,定義方法如下

public class BooknotExistException extends Exception{
    public BooknotExistException(){
        super("圖書不存在!");
    }
}
//異常檢測中輸出錯誤資訊

catch(BooknotExistException e){
            System.out.println(e.getMessage());

## 圖書查詢系統檔案程式碼

//自定義異常
public class BooknotExistException extends Exception{
    public BooknotExistException(){
        super("圖書不存在!");
    }
}

//自定義異常
public class ErrorCommandException extends Exception{
    public ErrorCommandException(){
        super("命令輸入錯誤,請根據提示輸入命令!");
    }
}



import java.util.InputMismatchException;
import java.util.Scanner;

public class SearchBook{

    String[] Book={"資料結構","大學物理"};
    Scanner input = new Scanner(System.in);
    int command;
    String name;
    int num;

    public static void main(String[] args) {
        while(true){
            SearchBook searchBook = new SearchBook();
            searchBook.inputCommand();
            if(searchBook.command == 1)
                searchBook.inputName();
            else if(searchBook.command == 2)
                searchBook.inputNumber();
            else if(searchBook.command == 0)
                break;
        }
    }

    public void inputCommand(){
        try{
            System.out.println("輸入命令:1-按照名稱查詢圖書,2-按照序號查詢圖書,0-結束查詢");
            command = input.nextInt();
            if(command != 1 && command != 2 && command !=0){
                throw new ErrorCommandException();
            }
        }catch(InputMismatchException e1){
            ErrorCommandException ee = new ErrorCommandException();
            System.out.println(ee.getMessage());
        } catch(ErrorCommandException e){
            System.out.println(e.getMessage());
        }
    }

    public void inputName(){
        try{
            System.out.println("輸入圖書名稱:");
            name = input.next();
            for(int i = 0; i < Book.length; i++){
                if(Book[i].equals(name)){
                    System.out.println("book:" + Book[i]);
                    return;
                }
            }
            throw new BooknotExistException();
        }catch(BooknotExistException e){
            System.out.println(e.getMessage());
        }
    }

    public void inputNumber(){
        try{
            System.out.println("輸入圖書序號:");
            num = input.nextInt();
            if(num > 2 ){
                throw new BooknotExistException();
            }
            System.out.println("book:" + Book[num - 1]);
        }catch(InputMismatchException e1){
            input.nextLine();
            ErrorCommandException ee = new ErrorCommandException();
            System.out.println(ee.getMessage());
        }catch(BooknotExistException e2){
            System.out.println(e2.getMessage());
        }
    }
}