C#错误变量在try-catch方法中未分配


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.ParseConsole.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之前发生故障,因此现在将不使用一个值。

最新更新