在以下代码中,可以在n1
块中访问整数n2
和try
。
但catch
和finally
块无法识别它们。我可以知道原因吗?!如果我尝试在n1
块和n2
块中打印catch
和finally
值,则会出现错误。
static void Main(string[] args)
{
int n1, n2;
try
{
n1 = Convert.ToInt32(Console.ReadLine());
n2 = Convert.ToInt32(Console.ReadLine());
int result;
result = n1 / n2;
Console.WriteLine("Result " + result);
}
catch (Exception ex)
{
Console.WriteLine("Error, please provide non zero value for denominator");
Console.WriteLine("n1 = {0} and n2 = {1}", n1, n2); -> why n1, n2 are unassigned local variables here.
Console.ReadLine();
}
finally
{
Console.ReadLine();
Console.WriteLine("n1 = {0} and n2 = {1}", n1, n2); -> why n1, n2 are unassigned local variables here.
}
}
答案 0 :(得分:0)
然而,它们不被catch捕获并最终阻止。我可以知道原因吗?!
当然 - 他们不是明确分配。想象一下Console.ReadLine
抛出异常。您捕获该异常 - 但尚未为n1
或n2
分配值。
您可能希望为它们声明它们提供初始值 - 这样它们总是被明确分配。但是不清楚你想要发生什么,或者为什么你试图在finally
块中使用它们。如果你真的想在 finally
块之后访问它们,你可以在catch
块中返回或重新抛出异常 - 这样,这是到达之后的唯一方法finally
块将通过代码将值分配给n1
和n2
,因此它们会被明确分配,您可以从中读取。
答案 1 :(得分:0)
编译器抱怨他们可能被取消分配,因为你只分配到try
块内的变量,并且就其而言,并不保证被捕获在作业之前,不会被抛出。
尝试将它们初始化为零:
int n1 = 0;
int n2 = 0;