2012-07-06 27 views
0

我得到一个错误,在代码中的if语句中的变量intAge下方的红线。它说这个变量是本地的,但是它在代码的开头声明的时候怎么会是本地的呢?它是否与Try/Catch部分有关?我的代码看起来像这样的原因,仅仅是因为我必须在代码中使用Try/Catch来执行此任务。请提供一些建议以相似和正确的方式解决此问题?谢谢!本地变量和Try/Catch

int intAge; 

     try 
     { 
      intAge = int.Parse(age); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Enter an age in numbers!","Error!"); 
     } 
     finally 
     { 

     } 
     // Check input 
     if (intAge < 1) 
     { 
      inputOk = false; 
      errorMessage = "Please enter 1 or higher!"; 
     } 
+3

这次很容易知道你的错误信息告诉你'intAge'是未初始化的,但下一次包括你得到的实际错误信息。当您的代码示例变得更长和更复杂时,包括错误消息可帮助人们更快地发现问题。 – 2012-07-06 09:03:40

+1

养成使用TryParse API的习惯。 – Zenwalker 2012-07-06 09:09:26

+0

_“局部变量”_仅表示在方法内声明(“已定义”)的变量。所以这是本地的方法。相反的是一个_field_,它是一个在课堂上定义的变量。还有一个_parameter_,它是你的方法签名中声明的一个变量。但是,所有这些与编译时错误无关。 – 2012-07-06 09:13:53

回答

3

只是初始化INTAGE:

int intAge = 0; 

你得到错误使用未分配的局部变量的。

由于您在try块中赋值,编译器无法确定赋值是否发生(如果int.Parse(age)引发异常),然后在您的检查if(intAge<1)中得到错误因为您正在使用之前未分配的变量。

Definite assignment - MSDN

在函数构件的可执行代码的给定位置,一 变量被认为是明确赋值如果编译器可通过静态流分析证明, ,该变量已经自动 已初始化或已成为至少一项作业的目标。

+0

感谢您的帮助! – 2012-07-06 09:15:42

+0

@ 3D-kreativ,欢迎您 – Habib 2012-07-06 09:16:05

2

它是本地的,因为它在本地范围内声明。你的代码可以更好的结构类似:

int intAge; 

if (!int.TryParse(age, out intAge)) 
{ 
    MessageBox.Show(... 
} 
else 
{ 
    if (intAge < 1) 
     { 
      inputOk = false; 
      errorMessage = "Please enter 1 or higher!"; 
     } 
} 

与您的代码你上面会显示两个错误,一个非数值,然后一个小于1的编译器的初始抱怨是因为你的整数是不保证被初始化。

+0

@Saeed:相互冲突的编辑? – Vlad 2012-07-06 09:03:37

+0

嗯,是的,你提供了一个更好的做法(比以前的尝试),但intAge不在本地范围内,其他答案是正确的(与这个问题有关),你的答案仍然适用。 – 2012-07-06 09:05:54

+0

这绝对是在本地范围内,它不保证被初始化。除非我在OP中的代码示例中缺少一点,否则它们都是相同的范围。 – Paddy 2012-07-06 09:31:59

3

如果int.Parse失败,则不会初始化intAge变量。 你可以在delecration

int intAge = 0; 

初始化它你可以避开双重错误:

int intAge; 

    if (!int.TryParse(age, out intAge)) 
    { 
     inputOk = false; 
     errorMessage = "Enter an age in numbers!"; 
    } 
    else 
    { 
     // Check input 
     if (intAge < 1) 
     { 
      inputOk = false; 
      errorMessage = "Please enter 1 or higher!"; 
     } 
    } 
1

编译器抱怨说,局部变量intAge可能没有被使用时第一次初始化。当int.Parse(age)引发异常时可能发生这种情况。要纠正这种情况,只需将intAge初始化为适当的值即可。

0

问题是未初始化的年龄初始化为0,并尝试。它必须工作