为什么在一个方法中分配局部变量,但在近似相同的方法中未分配?

时间:2014-11-19 21:47:00

标签: c# exception variable-assignment unassigned-variable

编译此代码时,收到编译错误,指出writerSaveArray中未分配的局部变量。它并没有在类似方法reader中抱怨LoadArray。为什么会这样?他们的行为不一样吗?

    static void SaveArray(string fileName,  string[,] arr)
    {
        StreamWriter writer;
        try
        {
            writer = new StreamWriter(fileName);
        }
        catch
        {
            MessageBox.Show("Error, could not open " + fileName + " for saving");
        }
        try 
        {
            foreach (string entry in playerArray)
            {
                writer.WriteLine(entry);
            }
        }
        catch
        {
            MessageBox.Show("Couldn't save");
        }
        writer.Close();
    }

    static void LoadArray(string fileName, string[,] arr)
    {
        StreamReader reader;

        try
        {
            reader = new StreamReader( fileName );
        }
        catch
        {
            MessageBox.Show("Error when reading file" +fileName);
            return;
        }


        try
        {
            for(int i=0; i<=arr.GetUpperBound(0); ++i)
            {
                for (int j = 0; j<=arr.GetUpperBound(1); ++j)
                {
                    arr[i, j] = reader.ReadLine();
                }
            }

        }
        catch
        {
            MessageBox.Show("Could not read from file " +fileName);
        }
        reader.Close();
    }

3 个答案:

答案 0 :(得分:4)

如果new StreamWriter(fileName);抛出异常,则s保持未分配状态。

尝试在s.WriteLine(entry);中使用它是一个错误。

@DarrenYoung 发表评论时,LoadArray会从catch返回,因此x中的x.ReadLine()保证会被初始化。

答案 1 :(得分:2)

LoadArray中,捕获的异常会导致该方法在使用阅读器之前返回。在SaveArray中,它捕获异常,但随后继续以其快乐的方式,即使作者从未完成分配。

始终记住,捕获的异常会立即突破正常的控制流,因此当前语句将无法完成执行。

答案 2 :(得分:1)

注意你如何声明一个名为writer的StreamWriter对象,但是在你输入try / catch块之前你不能初始化它。如果try catch失败会发生什么?

        StreamWriter writer;
        try
        {
            writer = new StreamWriter(fileName);
        }
        catch
        {
            MessageBox.Show("Error, could not open " + fileName + " for saving");
        }
        try 
        {
            foreach (string entry in playerArray)
            {
                writer.WriteLine(entry);
            }
        }
        catch
        {
            MessageBox.Show("Couldn't save");
        }
        writer.Close();