2015-04-29 41 views
0

我想知道如果我能得到一个手请。有人可以向我解释为什么我的字符串sqrt未在finally块中分配吗?为什么我必须申报?为什么不能在try或catch语句中声明?这将使编码更加乏味,更有组织。本地变量未分配的问题使用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输出到任何其他块的列表框中,它就可以工作(因为它已被声明)。有谁知道我该怎么做?我敢打赌这可能也很简单。我不是故意要咆哮,或者只是在过去的12个小时里我一直坚持下去,所以我开始感到失败。我很感谢大家的帮助,我真的这么做。

+0

http://stackoverflow.com/questions/94977/why-arent-variables-declared-in-try-in-scope-in​​-catch-or-finally这里是你的答案:) – Zze

+0

声明变量号为双倍比你可以做这个数字= Convert.ToDouble(number); – Mairaj

+1

好吧,用这种方式来看看吧:'finally'保证运行* always *,不管是什么(不包括停电等)。那么在'sqrt'设置之前'catch'块中的某些东西出错了怎么办?或者,如果抛出一个异常,你不知道该怎么办?然后'sqrt'没有设置,换句话说就是“未分配”。因此,解决这个问题的最简单方法是立即将它初始化为* something *。像:'string sqrt = string.Empty;'或者甚至'string sqrt = null;'。 – Corak

回答

0

变化:

int number; 
string sqrt; 

更新:

double number = 0.0; 
string sqrt = string.Empty; 
+0

这个答案为什么解决OP的问题?我的意思是,发布一段代码作为答案,没有解释为什么**这是一个答案,使得一个无用的答案。 – Tim

+0

我改变了'double number = 0.0;字符串sqrt = string.Empty;'尝试并检查它。 –

+0

是不是我的问题,我不需要尝试代码来知道它会做什么。同样,我的观点是包括对变化的解释,以及为什么它会使代码工作能够很好地解决问题。仅有代码的答案不会教任何人任何事情。你所做的改变的解释和**为什么**应该在你的答案中。 – Tim

2

您不能在try块中声明它,因为局部变量被绑定了scope。简而言之,块中声明的局部变量,即{},仅在该块中具有可见性。要插件,它会更好,如果你初始化sqrt""string.Empty,而宣布它。

4

如果任何在你的代码行:

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 "" 

关于你的评论:

可以通过声明它想解决这个

为什么不能我只是把它当作“数= COnvert.ToDouble(tbInput.Text)

试试这个:

var number = Double.Parse(tbInput.Text); 
+0

ahhhh,did not知道,所以基本上没有办法让字符串值继承?即使它是在其他任何区块中宣布的? – Spr89

+0

您正在处理的两个异常可能会被抛出并导致'sqrt'未被初始化。 – Alex

+0

@ Spr89 - 它会*被“结转”,但是你的代码并不能保证'finally'运行前肯定会有一个赋值。 – Corak

0

尝试分配的平方根的值。 string sqrt =“”; //在声明上sqrt可能不包含任何调用该问题的值。

0

@Corak,在任何块解决问题之前初始化字符串。

我改变

 string sqrt; 

 string sqrt=string.Empty; 
0

开方只会在声明它的范围可用。范围通常用花括号(比如方法体,语句)来分隔,或者在这种情况下用try,catch和finally子句。尝试在if子句中声明变量时,您会注意到同样的问题,然后尝试在else对象中使用该变量。如果您有很多这样的内容,并且只是在try或catch子句中声明它,则另一种方法是创建变量的全局映射,然后将“sqrt”键分配给每个范围内所需的对象。