Java try块代码不会执行

时间:2015-04-14 21:51:58

标签: java exception-handling applet try-catch

我不明白为什么这个try块中的代码不会执行。我得到一个编译错误,说我在try块之后使用这些变量时,可能无法初始化它们。

double star, planet, posLife, actLife, intelLife, comm, length;

try{
    star = Double.parseDouble(factor.elementAt(0).getText());    
    planet = Double.parseDouble(factor.elementAt(1).getText());
    posLife = Double.parseDouble(factor.elementAt(2).getText());
    actLife = Double.parseDouble(factor.elementAt(3).getText());
    intelLife = Double.parseDouble(factor.elementAt(4).getText());
    comm = Double.parseDouble(factor.elementAt(5).getText());
    length = Double.parseDouble(factor.elementAt(6).getText());
} catch(NumberFormatException E){ 
    System.err.println("NumberFormatException");
}   

4 个答案:

答案 0 :(得分:5)

首先,你在try块中定义的变量不应该在try块之外可见;所以我相信在尝试之前你必须有另一个double star;等。

现在,我假设你的代码更像是以下内容,因为你提到的代码不会出现你所提到的错误:

double a;
try {
    a = Double.parseDouble(/* blah */);
} catch (NumberFormatException e) {
    System.err.println("NumberFormatException");
}

这里,在执行这段代码之后,a可能完全没有初始化。实际上,如果在Double.parseDouble中发生任何错误,将跳过对a的赋值以跳转到不会返回的catch块。

因此,在上面的代码块之后,a可能未初始化,因此出现错误消息。

要修复它,你应该删除try块中变量之前的类型,并提供一个默认值,以防它无法解析double,或者,如果异常不能解析从此范围中恢复,首先不要捕获它。

答案 1 :(得分:3)

在尝试访问双打之前,您应该为双打分配一个默认值,我给了我一个值-1

如果需要在try-catch块之后使用它们,则必须在try块之前声明try-catch中使用的变量。

这是一个例子。

//Some default value
double star = -1;

try {
    star = 0;
} catch(NumberFormatException E){ 
    System.err.println("NumberFormatException");
}

//You can use this now.
System.out.println(star);

答案 2 :(得分:1)

starplanet等的范围仅限于try块。您需要在try块之外和之前声明它们。

double star = null;
try {
  star = Double.parseDouble(...
} catch(NumberFormatException e) {
  ...
}

System.out.println(star);

答案 3 :(得分:1)

你提到你已经弄明白了:“奇怪的是我还必须在try块之外初始化变量......”

那不是“奇怪”。考虑一下此代码在运行时可以采用的所有可能路径,包括特殊路径。如果您catch例外,会发生什么?程序继续,但 try块中的任何代码都不能保证已执行。所以你可能有未初始化的变量。并且“可能”我的意思是“肯定会”,因为异常发生的事实意味着try块中的某些没有完成执行,所以至少,你知道块中发生的最后一个语句 not 没有完成 - 这意味着length 从未被分配到

因此,如果发生异常,您将try阻止length阻止double(可能还有其他人,可能还有所有try s)未初始化。

另请注意,虽然您的问题询问为什么if块中的代码“没有执行”,但您看到的错误是编译错误,说明变量可能未初始化。如果编译器无法确保将初始化变量,则会抛出此错误 - 如果您的初始化代码是在任何类型的条件执行块(例如try语句或,就像在这种情况下,{{1}}块),当然编译器不能确保块总是会被执行,所以它不能保证变量将被初始化!