C# 使用Try、catch、finally的局部变量未分配问题
我想知道我是否能帮上忙。有人能解释一下为什么我的字符串C# 使用Try、catch、finally的局部变量未分配问题,c#,string,try-catch-finally,listboxitems,C#,String,Try Catch Finally,Listboxitems,我想知道我是否能帮上忙。有人能解释一下为什么我的字符串sqrt在finally块中没有赋值吗?我为什么要申报呢?为什么不能在try或catch语句中声明它?这将使编码变得不那么乏味,更有条理 private void btnDisplay_Click(object sender, EventArgs e) { int number; string sqrt; try { number =
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")
{
}
}
}
}
private void btnDisplay\u单击(对象发送方,事件参数e)
{
整数;
字符串sqrt;
尝试
{
number=Convert.ToInt32(tbInput.Text);
//为什么我不能把它作为“number=COnvert.ToDouble(tbInput.Text)”呢//
转换为双(数字);
如果(数字<0)
{
抛出新的NegativeEnumberException();
}
sqrt=Math.sqrt(number.ToString();
}
捕获(格式化异常错误)
{
lbOutput.Items.Add(错误消息);
lbOutput.Items.Add(“输入应该是一个数字”);
sqrt=“无法计算”;
}
捕获(负枚举异常负)
{
lbOutput.Items.Add(负消息);
sqrt=“无法计算”;
}
最后
{
//这里是我遇到“未分配局部变量”问题的地方//
lbOutput.Items.Add(“平方根”+sqrt);
}
}
类NegativeEnumberException:异常
{
公共负项EnumberException()
:base(“数字不能为负数”)
{
}
}
}
}
我试图在finally块中实现的是在列表框中显示“平方根”和“sqrt”,而不管sqrt的值是什么。如果我将sqrt输出到任何其他块中的列表框中,它都会工作(因为它已被声明).有人知道我该怎么做吗?我打赌这可能也很简单。我不想大声嚷嚷什么的,只是我已经起床12个小时了,所以我开始感到挫败。我真的很感谢大家的帮助。你不能在
try
块中声明它,因为局部变量是由绑定的。简言之,局部变量是由在块中声明的变量,即{}
,仅在该块中可见。若要添加,最好将sqrt
初始化为““
或字符串。声明时为空。不能在try
块中声明它,因为局部变量由绑定。简而言之,在块中声明的局部变量,即{}
,仅在该块中可见。要添加,最好在声明时将sqrt
初始化为”
或string.Empty
。如果代码中有以下行:
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
变量保持未赋值状态
您可以通过如下声明来解决此问题:
string sqrt = null; // or ""
关于你的评论:
为什么我不能把它作为“number=COnvert.ToDouble(tbInput.Text)”呢
试试这个:
var number = Double.Parse(tbInput.Text);
如果代码中存在以下任何一行:
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
变量保持未赋值状态
您可以通过如下声明来解决此问题:
string sqrt = null; // or ""
关于你的评论:
为什么我不能把它作为“number=COnvert.ToDouble(tbInput.Text)”呢
试试这个:
var number = Double.Parse(tbInput.Text);
更改:
int number;
string sqrt;
更新:
double number = 0.0;
string sqrt = string.Empty;
更改:
int number;
string sqrt;
更新:
double number = 0.0;
string sqrt = string.Empty;
尝试在sqrt上赋值。
字符串sqrt=“”//声明上的sqrt可能不包含任何调用问题的值。尝试在sqrt上赋值。
字符串sqrt=“”//在声明中,sqrt可能不包含任何调用问题的值。@Corak,在任何块解决问题之前初始化字符串
我变了
string sqrt;
到
@Corak,在任何块解决问题之前初始化字符串
我变了
string sqrt;
到
sqrt仅在声明的范围内可用。范围通常由大括号分隔,例如方法体、for语句,或者在本例中是try、catch和finally子句。在尝试在if子句中声明变量时,您会注意到同样的问题,然后尝试在else子句中使用该变量。如果您有很多这样的函数,并且设置为仅在try或catch子句中声明它,一种替代方法是创建变量的全局映射,然后将“sqrt”键分配给每个作用域中所需的对象。sqrt将仅在声明的作用域中可用。范围通常由大括号分隔,例如方法体、for语句,或者在本例中是try、catch和finally子句。在尝试在if子句中声明变量时,您会注意到同样的问题,然后尝试在else子句中使用该变量。如果您有很多这样的函数,并且只打算在try或catch子句中声明它,一种替代方法是创建变量的全局映射,然后将“sqrt”键分配给每个作用域中所需的对象。以下是您的答案:)将变量编号声明为可以执行的两倍此编号=Convert.ToDouble(编号);好吧,这样看:最终
保证始终运行,不管发生什么(不包括电源故障等)。因此,如果catch
块中的某些内容在设置sqrt
之前出错,该怎么办?或者,如果抛出了一个您没有捕获的异常,该怎么办?然后,sqrt
未设置,换句话说是“未分配”。所以最简单的方法就是马上初始化它。比如:stringsqrt=string.Empty
或甚至字符串sqrt=null代码>@Corak,完美,我在任何块之前初始化了字符串,现在它继续。再次感谢你的帮助^_^@Spr89-有一个细微但重要的区别。分配给sqrt
的值始终会被“结转”,但代码中的某些路径可能会导致最终
块,而不会将任何内容分配给sqrt
。真蠢