我不明白为什么这个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");
}
答案 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)
star
,planet
等的范围仅限于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}}块),当然编译器不能确保块总是会被执行,所以它不能保证变量将被初始化!