2010-09-08 42 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中必须特别更改项目属性,以便程序在外部控制台中运行,如果您想这样做。