局部变量未分配问题使用尝试,捕获,最后



我想知道我是否可以帮忙。有人可以向我解释为什么我的字符串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 块中实现的是让"平方根"和"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();
}

抛出一个不属于 NegativeNumberExceptionFormatException 类型的异常,则由于以下声明:

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"键分配给每个作用域中所需的对象。

相关内容

  • 没有找到相关文章

最新更新