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