C# 重试,直到用户输入正确
我正在学习C#via,在理解变量范围方面遇到了一个问题 我开发的类(在底部)要求输入一个数字,然后将其显示给用户。我想对它进行增强,这样如果用户输入10而不是10,它将输出一条消息,用户将再次尝试 以下是迄今为止在改变方面的几次尝试之一C# 重试,直到用户输入正确,c#,C#,我正在学习C#via,在理解变量范围方面遇到了一个问题 我开发的类(在底部)要求输入一个数字,然后将其显示给用户。我想对它进行增强,这样如果用户输入10而不是10,它将输出一条消息,用户将再次尝试 以下是迄今为止在改变方面的几次尝试之一 ... static int readInt(string prompt, int low, int high) { int result; do { try
...
static int readInt(string prompt, int low, int high)
{
int result;
do
{
try
{
string intString = readString(prompt);
result = int.Parse(intString);
Console.WriteLine("Thank you");
}
catch
{
Console.WriteLine("Invalid age value");
}
} while ((result < low) || (result > high));
return result;
}
...
编译器不知道
while
循环实际运行(它可以在分配结果
之前抛出异常)并在结果
上设置一个值。因此,它对此表示不满
您可以通过为结果指定默认值来规避此问题:
int result = -1;
或者通过在catch
块中设置值:
catch
{
result = -1;
Console.WriteLine("Invalid age value");
}
在这些情况下,我总是使用-1
作为“此值有问题”的指示器。除了Patrick Hoffman的答案(这是正确的)之外,您还应该考虑使用int.TryParse
而不是int.Parse
将异常处理用于流控制通常是个坏主意,这说明了其中一个原因。编译器意识到在实际分配结果之前可能会发生异常(如果用户从未输入数值,事实上就是这种情况)。它将无法正确计算未赋值变量。如果使用TryParse
,则不会出现此特定问题
只有当您意识到存在超出常规代码和检查控制或处理能力的因素时,才应使用异常处理(if(bTryParseReturn==false)…
)-例如,当用户输入可能存在问题,无法直接测试时。即使这样,异常也会产生一个错误,而不仅仅是“重试”情况——完全可能永远无法从异常中恢复或避免异常,特别是因为您正在捕获所有异常(而不仅仅是InvalidCastException
或类似的情况)。例如,假设异常是一个System.OutOfMemoryException
(用户试图在您的提示下输入一个terrabyte的数据)。从用户的角度来看,您的程序将尝试愉快地运行,但会可怕地崩溃。编译器无法保证属性结果已设置,但仍希望在方法结束时输出结果
可能会引发异常或各种其他问题,阻止在到达方法的最后一行之前设置结果
因此,编译器正在抢占NullReferenceException场景,并将其视为编译错误
这是在帮你一个忙:)
如前所述,为属性结果提供一个默认值以解决此问题
如果属性处于类级别,则会隐式设置它的属性类型默认值-但这是另一个问题。如果您最初确实不想将结果设置为任何值,则只想添加可能的解决方案:
static int readInt(string prompt, int low, int high)
{
bool validInput;
int result;
do
{
if ((validInput = int.TryParse(readString(prompt), out result)))
Console.WriteLine("Thank you");
else
Console.WriteLine("Invalid age value");
} while (!validInput || (result < low) || (result > high));
}
static int readInt(字符串提示,int低,int高)
{
布尔有效输入;
int结果;
做
{
if((validInput=int.TryParse(读取字符串(提示),输出结果)))
Console.WriteLine(“谢谢”);
其他的
Console.WriteLine(“无效年龄值”);
}而(!validInput | | |(结果<低)| |(结果>高));
}
如果TryParse
失败,结果将被设置为整数默认值(0),并且validInput
变量将被设置为false,以便再次执行循环。谢谢,我非常感谢您提供的异常处理指南和int.TryParse,这两种方法都非常受欢迎。
static int readInt(string prompt, int low, int high)
{
bool validInput;
int result;
do
{
if ((validInput = int.TryParse(readString(prompt), out result)))
Console.WriteLine("Thank you");
else
Console.WriteLine("Invalid age value");
} while (!validInput || (result < low) || (result > high));
}