2010-09-08 28 views
1

我是新來的C#時,遇到了錯誤,我想不通爲什麼我總是收到一個「出現FormatException是未處理的」錯誤,當我運行此方法:C# - 試圖解析用戶輸入爲int

public void bet() 
{ 
    int betAmount; 

    Console.WriteLine("How much would you like to bet?"); 
    betAmount = int.Parse(Console.ReadLine()); 
    Console.WriteLine(_chips - betAmount); 
} 

該程序不會停止等待用戶輸入,我不知道這是爲什麼?

我該如何讓程序等待用戶輸入的方法?

**我在Microsoft Visual C#2010 Express上作爲控制檯應用程序運行程序。

+0

應該停止。試試'string line = Console.ReadLine(); betAmount = int.Parse(line);'。在調試器中單步執行,看它是否在ReadLine上等待。 – 2010-09-08 19:03:53

+1

你如何運行這個程序? – ngroot 2010-09-08 19:05:54

+0

它被編譯爲控制檯應用程序? – 2010-09-08 19:11:37

回答

7

您需要處理Console.ReadLine()返回非整數值的情況。在你的情況,你可能會得到這個錯誤,因爲某些輸入不正確。

您可以通過切換到TryParse解決這個問題:

public void bet() 
{ 
    int betAmount; 

    Console.WriteLine("How much would you like to bet?"); 
    while(!int.TryParse(Console.ReadLine(), out betAmount)) 
    { 
     Console.WriteLine("Please enter a valid number."); 
     Console.WriteLine(); 
     Console.WriteLine("How much would you like to bet?"); 
    } 

    Console.WriteLine(_chips - betAmount); 
} 

int.TryParse將返回false,如果用戶類型不是整數以外的東西。以上代碼將導致程序不斷重新提示用戶,直到他們輸入有效的號碼而不是提高FormatException

這是一個常見問題 - 無論何時您解析用戶生成的輸入,都需要確保輸入的輸入格式正確。這可以通過異常處理或通過定製邏輯(如上)來處理不正確的輸入。永遠不要相信用戶正確輸入值。

+0

我認爲TryParse是一個弱點,正如你所說 - 「永遠不要相信用戶輸入正確的值」,這就是弱點所在,這解釋了我關於正則表達式的觀點,它是防彈的「任何時候你解析用戶生成的輸入,你需要確保輸入是以正確的格式輸入的「 - 它捕捉到錯誤的輸入。 – t0mm13b 2010-09-08 19:27:41

+0

@ tommieb75:這正是TryParse爲你所做的 - 它無需處理異常就可以處理,而且不會強制正則表達式,加上它與本地化等處理它。 – 2010-09-08 19:34:44

+0

好吧 - 這很好,所以!來自我的+1 ...沒有想到那裏的本地化...... meh! – t0mm13b 2010-09-08 19:37:24

-1

可能會更好,更防彈做對輸入數字的正則表達式,例如:

public static Regex NumInpRegex = new Regex(
     "^(?<inp_num>\\d+)$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.Singleline 
    | RegexOptions.ExplicitCapture 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 
string InputText = Console.ReadLine(); 
Match m = NumInpRegex.Match(InputText); 
if (m.Success && InputText.Length > 0){ 
    betAmount = int.Parse(m.Groups["inp_num"].Value); 
    Console.WriteLine(_chips - betAmount); 
} 
+4

哇 - 當一個簡單的TryParse會告訴你同樣的事情時,看起來真是太過分了。 – 2010-09-08 19:10:13

+0

@Reed:也許...但它的萬無一失,不會引發FormatException .. – t0mm13b 2010-09-08 19:11:21

+0

@ tommieb75:'int.TryParse'也不會。 – 2010-09-08 19:16:11

0

你使用Visual Studio?其他一些IDE可能默認以非交互模式運行控制檯應用程序。例如,我知道在MonoDevelop中必須特別更改項目屬性,以便程序在外部控制檯中運行,如果您想這樣做。