2

我没有发现这段代码有任何错误,但是 eclipse 告诉我变量没有初始化。这只是一个警告,但编译后它也不起作用。我根本找不到这个代码 100% 正确的错误和事情。请注意,此代码的结构不能轻易更改,因为下面提供的代码已简化,因此您无需阅读太多内容;-)

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);
}
4

7 回答 7

2

您必须在所有变量进入任何 try块之前对其进行初始化。Java 编译器不知道在您的情况下,不会导致异常。

所以从理论上讲,某处可能存在一个异常,导致您的变量未初始化。这是不可接受的。因此发出警告。

只需将变量初始化为零。

int min1 = 0;
float somefloat = 0f;
于 2013-02-12T11:56:25.977 回答
1

编译器不会分析在具体情况下变量是否会被初始化。它确保如果变量仅在try中初始化,而不是在catch中初始化,或者最后它会确保它们可能不会被初始化。

使用“明显”的条件进行类似的尝试,例如if(1>0) {}. 编译器编译而不是分析您的代码。虽然对于人类来说很明显会发生一些事情,但 java 编译器没有代码来检测这种情况,java 语法也没有指定它。因此,您期望编译器提供它所没有的 AI,以保持编译清晰、可预测和快速。

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

于 2013-02-12T12:01:23.027 回答
0

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

int min1=0; float somefloat=0.0f;
于 2013-02-12T11:54:33.923 回答
0

但是eclipse告诉我变量没有初始化

显示警告是因为有可能在变量在 中初始化之前引发异常try。然后内部while变量保持未初始化。

于 2013-02-12T11:57:15.580 回答
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);

}

于 2013-02-12T11:57:59.210 回答
0

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

于 2013-02-12T12:07:07.963 回答
-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");
    } 
}

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

于 2013-02-12T12:01:33.087 回答