我想知道我是否可以帮忙。有人可以向我解释为什么我的字符串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 个小时,所以我开始感到失败。我感谢大家的帮助,我真的做到了。
如果代码中有以下任何行:
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();
}
抛出一个不属于 NegativeNumberException
或 FormatException
类型的异常,则由于以下声明:
string sqrt;
您的sqrt
变量将保持未赋值状态。
您可以通过声明它来解决此问题:
string sqrt = null; // or ""
关于您的评论:
为什么我不能把它作为"number=COnvert.ToDouble(tbInput.Text)"?
试试这个:
var number = Double.Parse(tbInput.Text);
你不能在try
块中声明它,因为局部变量是按作用域绑定的。简而言之,在块中声明的局部变量,即{}
,仅在该块中具有可见性。对于插件,最好在声明它的同时将sqrt
初始化为 ""
或 string.Empty
。
更改 :
int number;
string sqrt;
更新:
double number = 0.0;
string sqrt = string.Empty;
尝试在 sqrt 上分配一个值。字符串 sqrt = ";//在声明 sqrt 上可能不包含任何调用问题的值。
@Corak,在任何块解决问题之前初始化字符串。
我变了
string sqrt;
自
string sqrt=string.Empty;
sqrt 将仅在声明的范围内可用。作用域通常由大括号(如方法主体、for 语句)分隔,在本例中由 try、catch 和 finally 子句分隔。尝试在 if 子句中声明变量,然后尝试在 else 对应项中使用该变量时,您会注意到同样的问题。如果你有很多这样的变量,并且设置为只在 try 或 catch 子句中声明它,一种替代方法是创建一个变量的全局映射,然后将"sqrt"键分配给每个作用域中所需的对象。