static void Main(string[] args)
{
int lengthCountdown;
print tell = new print();
timer counter = new timer();
Error invalidInput = new Error();
tell.tell("Hi i am John");
tell.tell("How long should the countdown last?");
try
{
lengthCountdown = int.Parse(Console.ReadLine());
}
catch(FormatException)
{
invalidInput.valueError();
}
counter.timing(lengthCountdown);
tell.tell("That was a " + lengthCountdown + " second countdown");
}
它说在计数器中"长度计算"中存在错误。错误:"使用未分配的本地变量" ...如果我不使用try-catch方法,则不会显示错误。
如果您没有尝试/捕获块,则只能达到使用 lengthCountdown
的陈述。P>
如果int.Parse
或Console.ReadLine()
投掷FormatException
,尽管事实上没有将值分配给lengthCountdown
变量,但您当前正在捕获该异常,然后继续进行。编译器正在阻止您尝试读取变量的值,而无需在代码中分配一个值。
尚不清楚您的想要在用户输入错误时要做什么,但是请继续执行代码的其余部分,就好像您有有效的信息一样(即使在警告用户或任何invalidInput.valueError()
之后,做(是个坏主意。您可以在声明点给lengthCountDown
一个初始值,但在这种情况下这不太明智。
问题是可以从 int.Parse()
内部抛出异常,而当try
块退出时,lengthCountdown
不会分配。
超过try-catch
,您正在访问变量,但是通过int.Parse()
并直接进入catch
块,其中变量永远不会收到值。
要解决问题,您必须在第一行(错过点(中分配一个初始值,或者将消耗变量值的其余代码移动到try
块中:
static void Main(string[] args)
{
print tell = new print();
timer counter = new timer();
Error invalidInput = new Error();
tell.tell("Hi i am John");
tell.tell("How long should the countdown last?");
try
{
int lengthCountdown = int.Parse(Console.ReadLine());
counter.timing(lengthCountdown);
tell.tell("That was a " + lengthCountdown + " second countdown");
}
catch(FormatException)
{
invalidInput.valueError();
}
}
您必须在第一行中分配一个初始值,以便长度计数,尝试这种代码的曲折:
....
int lengthCountdown = 0;
....
问题在于您仅声明
的代码行中int lengthCountdown;
而不是也不分配它。这是一个编译时间错误,而不是通过try-catch块捕获的运行时错误。其原因是在使用之前需要将值分配给值,与参考不同。类型(类,对象(可能在其创建上具有默认值。
您需要做的就是将其分配给默认值(零或-1或任何非任意数据范围内的值(
int lengthCountdown = 0;
您可以使用int.tryparse((而不是int.parse((进行更安全的转换加上以这种方式,甚至可以消除try-catch块,如果仅用于此目的。
如果您不使用try-catch
块,则抛出异常,并且执行路径离开方法。因此,counter.timing(lengthCountdown);
将永远无法达到。
使用try-catch
块时,当FormatException
被抛出时,捕获了异常。不回头,以便继续执行。但是,由于Parse
在将值分配给lengthCountdown
之前发生故障,因此现在将不使用一个值。