【发布时间】:2015-04-29 05:52:34
【问题描述】:
我想知道是否可以帮忙。有人可以向我解释为什么我的字符串 sqrt 在 finally 块中未分配吗?为什么我必须申报?为什么不能在 try 或 catch 语句中声明?这将使编码变得不那么乏味,更有条理。
private void btnDisplay_Click(object sender, EventArgs e)
{
int number;
string sqrt;
try
{
number = Convert.ToInt32(tbInput.Text);
//Why cant i just have it as "number=COnvert.ToDouble(tbInput.Text)?//
Convert.ToDouble(number);
if (number < 0)
{
throw new NegativeNumberException();
}
sqrt = Math.Sqrt(number).ToString();
}
catch (FormatException error)
{
lbOutput.Items.Add(error.Message);
lbOutput.Items.Add("The input should be a number.");
sqrt = "not able to be calculated";
}
catch (NegativeNumberException neg)
{
lbOutput.Items.Add(neg.Message);
sqrt = "not able to be calculated";
}
finally
{
//Here is where i am having the issue "Unassigned local variable"//
lbOutput.Items.Add("Square Root " + sqrt);
}
}
class NegativeNumberException : Exception
{
public NegativeNumberException()
: base("Number can’t be negative")
{
}
}
}
}
我试图在 finally 块中实现的是“平方根”和“sqrt”显示在列表框中,无论 sqrt 的值是什么。如果我将 sqrt 输出到任何其他块中的列表框,它就可以工作(因为它已被声明)。有谁知道我该怎么做?我敢打赌,这可能也很简单。我不是要咆哮或任何事情,只是我在过去的 12 个小时里一直在起床,所以我开始感到挫败。感谢大家的帮助,我真的很感谢。
【问题讨论】:
-
stackoverflow.com/questions/94977/… 这是你的答案:)
-
声明变量 number 比你能做的两倍 number=Convert.ToDouble(number);
-
好吧,这样看:
finally保证始终运行,无论如何(不包括电源故障等)。那么如果在设置sqrt之前catch块中的某些内容出错了怎么办?或者如果抛出了你没有捕捉到的异常怎么办?然后sqrt没有设置,换句话说“未分配”。因此,解决这个问题的最简单方法是立即将其初始化为 something。喜欢:string sqrt = string.Empty;甚至是string sqrt = null;。 -
@Corak,完美,我在任何块之前初始化了字符串,现在它继续存在。再次感谢您的帮助。 ^_^
-
@Spr89 - 有一个细微但重要的区别。分配给
sqrt的值将始终被“继承”,但代码中的某些路径可能会导致finally块,而无需为sqrt分配任何内容。因此,在开头分配 something (null或string.Empty甚至"Hello World")可以保证,在finally块运行。
标签: c# string try-catch-finally listboxitems