2013-02-12 45 views
2

我没有发现这个代码有任何错误,但是eclipse告诉我变量没有被初始化。这只是一个警告,但编译后也不起作用。我根本找不到这个代码100%正确的错误和事情。请注意,可以因为下面提供的代码被简化不会轻易改变这个代码的结构,所以你不要有太多的阅读;-)Java:局部变量被初始化,仍然出错

int min1; float somefloat; 
try { 
    //setting values for min and somefloat 
    min1 = 1; 
    somefloat = 0.92f; 
} catch (IOException ioe) { 
    System.err.println("Read Exception"); 
} 
while (true){ 
    //warning: variables min1 and somefloat may not be initialized. 
    float value1 = (1023 - min1) * somefloat; 
    System.out.println("Value: " + value1); 
} 

回答

1

编译器不分析,如果在具体案例中的变量将被初始化或没有。它确保如果变量只在初始化尝试,而不是在终于将保证他们可能将未初始化。

给出与“明显”条件类似的尝试,如if(1>0) {}。编译器编译而不是分析你的代码。虽然对于人来说,显然会发生某些事情,但是java编译器没有代码来检测这种情况,它们都不是由java语法指定的。所以你希望编译器不需要AI,以保持编译的清晰,可预测和快速。

你的代码有,顺便说一句,错误将被报告,而不是你描述的这个,因为没有地方IOException可以被抛出。

+0

IOException可以抛出原代码 – 2013-02-12 12:05:16

+1

但是读者只能看到你发布的内容。 – 2013-02-12 12:06:29

0

你必须初始化它们同时至少声明它们或在try-catch区块之外。因为编译器不能确定try-catch块内的初始化是否会正常完成,在这种情况下,你将会在外面有一个未初始化的变量。

int min1=0; float somefloat=0.0f; 
+1

这就是问题所在。在发生任何异常之前,它们都在try块内初始化。 – jlordo 2013-02-12 11:55:22

+0

但在try-catch块中通常可能有错误。如果出现错误,初始化可能会被跳过 - 然后它们不会被初始化。 – MalaKa 2013-02-12 11:56:52

+0

@jlordo好吧,在你使用它们之前,局部变量需要被初始化。 – PermGenError 2013-02-12 11:56:55

2

你必须初始化所有的变量,他们进入任何try块之前。 Java编译器不知道在你的情况下,没有办法导致异常。

因此从理论上讲,可能是是一个例外某处这会使您的变量未初始化。这是不可接受的。因此警告。

只需将您的变量初始化为零。

int min1 = 0; 
float somefloat = 0f; 
0

然而日食告诉我,该变量未初始化

显示警告的原因这是一个可能性,即例外的是变量中try初始化之前抛出。那么在while内变量保持未初始化。

0

它们应该有一个初始值,以防进入catch区块。试试这个:

int min1 = 0; float somefloat = 0f; 
try { 
    //setting values for min and somefloat 
    min1 = 1; 
    somefloat = 0.92f; 
} catch (IOException ioe) { 
    System.err.println("Read Exception"); 
} 
while (true){ 
    //warning: variables min1 and somefloat may not be initialized. 
    float value1 = (1023 - min1) * somefloat; 
    System.out.println("Value: " + value1); 

}

-1
private void tset(){ 
    int min1; float somefloat; 
    try { 
     //setting values for min and somefloat 
     min1 = 1; 
     somefloat = 0.92f; 
    while (true){ 
     //warning: variables min1 and somefloat may not be initialized. 
     float value1 = (1023 - min1) * somefloat; 
     System.out.println("Value: " + value1); 
    } 
    } catch (Exception ioe) { 
     System.err.println("Read Exception"); 
    } 
} 

这可能是您正在寻找的代码...

+2

使用互联网速记(“b”,“u”,“r”)在这里皱起了眉头。请尝试用真实的文字写出完整的句子。它使阅读和理解变得更容易。 – pap 2013-02-12 12:20:13

0

你需要在声明期间初始化变量。在try中的变量赋值会覆盖该值,如果发生任何异常(不知道你的情况如何..)它将采用默认值。在编译期间,编译器不会查看你的代码是否会抛出异常(除了throw,它需要匹配catch),所以它需要一个明确的初始化。