问题 try-catch和final变量[重复]


这个问题在这里已有答案:


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