首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 異常處理入門實戰:try-catch 捕獲輸入異常、Scanner 次Int 異常處理與程序健壯性提升

     編輯:Java 綜合教學

Java 異常處理入門實戰:try-catch 捕獲輸入異常、Scanner 次Int 異常處理與程序健壯性提升

異常處理是編寫健壯程序的基礎。本文通過一個「輸入兩數相加」的案例,演示 Scanner.nextInt() 遇到非數字輸入拋出 InputMismatchException 的捕獲與處理流程,並說明異常對象常用方法與最佳實踐。

一、案例代碼:安全的數字輸入

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

public class ExceptionDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入數字給第一個加數賦值:");

        int num1 = 0;
        try {
            num1 = sc.nextInt();  // 若輸入 "abc" 拋出 InputMismatchException
        } catch (InputMismatchException e) {
            System.out.println("輸入的信息中出現數字以外的其他字符。");
            sc.nextLine();  // 關鍵:清空緩衝區殘留的非法輸入,防止死循環
        }

        int num2 = 123;
        System.out.println(num1 + "+" + num2 + "=" + (num1 + num2));
    }
}

二、運行效果演示

輸入控制台輸出說明
8888+123=211正常數字,try 塊完成,catch 不執行
abc輸入的信息中出現數字以外的其他字符。
0+123=123
拋出異常,catch 捕獲,num1 保持初始值 0
12.5輸入的信息中出現數字以外的其他字符。
0+123=123
小數非整數,同樣拋出 InputMismatchException

三、關鍵點深度解析

1. 為什麼需要 sc.nextLine() 清空緩衝區?

Scanner.nextInt() 讀取失敗時不消耗緩衝區中的非法字符,若不清理,後續循環調用會反覆讀取同一非法輸入導致無限循環拋出異常。

2. 異常對象常用方法

方法返回值用途
e.getMessage()String異常詳細描述(如 "For input string: \"abc\"")
e.toString()String異常類名 + 描述(如 "java.util.InputMismatchException: For input string: \"abc\"")
e.printStackTrace()void輸出完整堆棧軌跡至標準錯誤流,調試必備
e.getCause()Throwable獲取根因異常(鏈式異常)

3. 異常體系回顧

Throwable
├── Error (嚴重錯誤,不可恢復,如 OutOfMemoryError)
└── Exception (異常,可捕獲處理)
    ├── RuntimeException (運行時異常,非受檢,如 NullPointerException, InputMismatchException)
    └── IOException 等 (受檢異常,編譯強制處理)

四、進階改進:循環直到輸入合法

public static int readInt(Scanner sc, String prompt) {
    while (true) {
        System.out.print(prompt);
        try {
            return sc.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("輸入無效,請輸入整數。");
            sc.nextLine();  // 清空緩衝區
        }
    }
}

// 使用
int num = readInt(new Scanner(System.in), "請輸入年齡:");

五、最佳實踐總結

  1. 具體捕獲:捕獲具體異常類(InputMismatchException)而非通用 Exception,避免吞沒其他錯誤。
  2. 資源清理:使用 try-with-resources(Java 7+)自動關閉 Scanner。
  3. 日誌記錄:生產代碼請用 SLF4J/Log4j 記錄 e.printStackTrace() 而非直接輸出控制台。
  4. 用戶友好:向用戶展示業務語義錯誤信息,而非堆棧軌跡。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved