当我编译此代码时,我收到一个编译错误,指出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();
}
如果new StreamWriter(fileName);
引发异常,则s
保持未分配状态。
尝试在s.WriteLine(entry);
中使用它是一个错误。
正如@DarrenYoung评论的那样,LoadArray
从 catch
返回,因此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();