使用Try,catch,最后

时间:2015-04-29 05:52:34

标签: c# string try-catch-finally listboxitems

我想知道我是否能得到一只手。有人可以向我解释为什么我的字符串sqrtfinally块中未被分配?为什么我必须申报呢?为什么不能在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块中实现的是“Square Root”和“sqrt”将显示在列表框中,无论sqrt的值是什么。如果我将sqrt输出到任何其他块中的列表框,它就可以工作(因为它已被声明)。有谁知道我怎么能做到这一点?我打赌它可能也很简单。我并不是说咆哮或任何它只是我在过去12小时内一直在努力,所以我开始感到失败。我真的很感谢大家的帮助。

6 个答案:

答案 0 :(得分: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();
}

引发不属于NegativeNumberExceptionFormatException类型的异常,然后由于此声明:

string sqrt;

您的sqrt变量仍然未分配。

你可以通过声明它来解决这个问题:

string sqrt = null; // or ""

关于你的评论:

  

为什么我不能把它作为“number = COnvert.ToDouble(tbInput.Text)?”

试试这个:

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

答案 1 :(得分:2)

您无法在try块中声明它,因为局部变量由scope绑定。简而言之,在块中声明的局部变量{}仅在该块中具有可见性。对于插件,如果您在声明时将sqrt初始化为""string.Empty会更好。

答案 2 :(得分:0)

更改:

int number;
string sqrt;

更新:

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

答案 3 :(得分:0)

尝试在sqrt上分配值。 声明sqrt上的字符串sqrt =“”; //可能不包含任何调用问题的值。

答案 4 :(得分:0)

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

我改变了

     string sqrt;

     string sqrt=string.Empty;

答案 5 :(得分:0)

sqrt仅在声明的范围内可用。范围通常由花括号(例如方法体),语句(或者在本例中为try,catch和finally子句)分隔。尝试在if子句中声明变量时会注意到同样的问题,然后尝试在else对应项中使用该变量。如果您有很多这些,并且只在try或catch子句中声明它,则可以选择创建全局变量映射,然后将“sqrt”键分配给每个范围内所需的对象。 / p>