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

C# 控制台輸入陷阱:為何輸入 q 退出卻拋出 FormatException?

     編輯:程式設計綜合問答

錯誤代碼複現

int number;
string input;
do {
    Console.WriteLine("number,plz");
    number = Convert.ToInt32(Console.ReadLine()); // 第一次讀取
    input = Console.ReadLine();                   // 第二次讀取
    Console.WriteLine("doule number is {0}!", (number * 2));
} while (input != "q");

錯誤根因

循環體內調用了 兩次 Console.ReadLine():

  1. 第一次讀取用於轉換整數(Convert.ToInt32)。
  2. 第二次讀取賦值給 input 判斷是否退出。

當用戶輸入 q 並按回車時:

  • 第一次 ReadLine() 返回 "q",Convert.ToInt32("q") 直接拋出 FormatException(“輸入字符串的格式不正確”)。
  • 程序崩潰,根本執行不到第二次讀取與判斷邏輯。

正確寫法:單次讀取,先判斷再轉換

string input;
do {
    Console.Write("請輸入整數 (輸入 q 退出): ");
    input = Console.ReadLine();
    
    if (input?.ToLower() == "q") break; // 先判斷退出條件
    
    if (int.TryParse(input, out int number)) { // 安全轉換
        Console.WriteLine($"雙倍結果: {number * 2}");
    } else {
        Console.WriteLine("輸入無效,請輸入整數!");
    }
} while (true);

關鍵改進點

  • 只調用一次 ReadLine():每次循環只讀取一行輸入。
  • 優先檢查退出標記:在類型轉換前處理 "q"。
  • 使用 int.TryParse 替代 Convert.ToInt32:避免異常控制流,代碼更健壯、性能更好。
  • 空值檢查:input?.ToLower() 防止按 Ctrl+Z (EOF) 導致 input 為 null。

擴展:通用的控制台輸入輔助方法

public static T ReadInput<T>(string prompt, Func<string, T> parser, string exitToken = "q") {
    while (true) {
        Console.Write(prompt);
        var line = Console.ReadLine();
        if (line?.Trim().Equals(exitToken, StringComparison.OrdinalIgnoreCase) == true) {
            return default; // 或拋出自定義異常表示用戶主動退出
        }
        try {
            return parser(line);
        } catch {
            Console.WriteLine("格式錯誤,請重新輸入。");
        }
    }
}

// 使用示例
var num = ReadInput("輸入數字: ", int.Parse);
if (num != 0) Console.WriteLine($"結果: {num * 2}");

總結

控制台交互的核心原則:讀取一次、先驗證業務邏輯(退出)、再做類型轉換、優先用 TryParse 系列方法。這能消除 90% 的初學者輸入異常問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved