为什么在一种方法中分配局部变量,而在几乎相同的方法中未分配

本文关键字:方法 分配 局部变量 一种 为什么 | 更新日期: 2023-09-27 18:31:17

当我编译此代码时,我收到一个编译错误,指出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();
    }

为什么在一种方法中分配局部变量,而在几乎相同的方法中未分配

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

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

正如@DarrenYoung评论的那样,LoadArraycatch 返回,因此x.ReadLine()中的x保证被初始化。

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

永远记住,捕获的异常会立即脱离正常的控制流,因此当前语句不会完成执行。

请注意,您如何声明一个名为 writer 的 StreamWriter 对象,但在输入 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();