这个问题在这里已有答案:
8852
2018-06-29 18:43
起源
编译器并不那么聪明,如果你声明该方法可能会抛出一个异常编译器就不会难以检查它,所以为了简单起见它不允许这样的事情发生 - Toumash
答案:
Java编译器看不到你和我看到的东西 - 那也是 status
设置为 "OK"
或者它被设置为 "BAD"
。它假设 status
可以设定 和 抛出异常,在这种情况下会被分配两次,并且编译器会生成错误。
要解决此问题,请为其分配临时变量 try
- catch
阻止,并分配 final
之后变量一次。
final String status;
String temp;
try {
method1();
method2();
method3();
temp = "OK";
} catch (Exception e) {
temp = "BAD";
}
status = temp;
10
2018-06-29 18:47
我认为它仍然是有效的错误,如果这个线程被中断并抛出该怎么办 InterruptedException 在任命之后 - Jigar Joshi
@JigarJoshi它不能扔 InterruptedException (也许是其他东西,但不是那样,可能不在这段代码中)。 - Sotirios Delimanolis
如果这是在单独的线程中并且被调用 interrupt() - Jigar Joshi
@JigarJoshi然后将中断标志设置为 Thread。一个 InterruptedException 只有在IO上阻塞线程(或类似的东西:锁等)时才会发生。 - Sotirios Delimanolis
@Sotirios你是对的 - 谢谢! - Jigar Joshi
如果导致异常的代码发生了怎么办? 后 status = "OK"
?你得到错误的原因似乎很明显。
以此为例:
final String status;
try {
status = "OK":
causeException();
}catch(Exception e) {
status = "BAD";
}
void causeException() throws Exception() {
throw new Exception();
}
这将导致重新分配变量, 这就是你得到错误的原因。
2
2018-06-29 18:47
变量是最终的。禁止重新分配。 - swinkler
@swinkler这就是我遇到的问题。发生错误是因为上面显示的代码是可能的。男人,现在有多少StackOverflow ... - Vince Emigh