1

このコードをコンパイルするとwriter、 が割り当てられていないローカル変数であるというコンパイル エラーが表示されSaveArrayます。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();
    }
4

3 に答える 3

4

new StreamWriter(fileName);例外がスローされた場合、s未割り当てのままになります。

で使用しようとするとs.WriteLine(entry);エラーになります。

そして@DarrenYoungがコメントしたように、LoadArrayから返されるcatchためx、 inx.ReadLine()は初期化されることが保証されています。

于 2014-11-19T21:48:18.137 に答える
2

ではLoadArray、キャッチされた例外により、リーダーが使用される前にメソッドが返されます。ではSaveArray、例外をキャッチしますが、ライターの割り当てが完了していなくても、引き続き順調に進んでいます。

キャッチされた例外はすぐに通常の制御フローから抜け出すため、現在のステートメントは実行を終了しないことに常に注意してください。

于 2014-11-19T21:50:18.500 に答える
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();
于 2014-11-19T22:07:54.350 に答える