try-catch和final变量

时间:2015-06-29 18:43:45

标签: java compiler-errors

我有一个非常愚蠢的问题:)

例如,我有以下代码段:

class MyClass {

    public static void main (String[] args) {

        final String status;

        try {
            method1();
            method2();
            method3();
            status = "OK";
        } catch (Exception e) {
            status = "BAD"; // <-- why compiler complains about this line??
        }

    }

    public static void method1() throws Exception {
        // ...
    }

    public static void method2() throws Exception {
        // ...
    }

    public static void method3() throws Exception {
        // ...
    }

}

问题在于:为什么编译器抱怨这一行?

IntelliJ IDEA说,Variable 'status' might already have been assigned to

但是,正如我所看到的,如果遇到特殊情况,我们就无法到达线路(我们设置status = "OK")。所以status变量将是BAD,一切都应该没问题。如果我们没有任何例外,那么我们会得到OK。我们只会在一段时间内设置此变量。

对此有何想法?

感谢您的帮助!

2 个答案:

答案 0 :(得分:10)

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;

答案 1 :(得分:2)

如果在 status = "OK"之后导致异常的代码怎么办?你得到错误的原因似乎很明显。

以此为例:

final String status;

try {
    status = "OK":
    causeException();
}catch(Exception e) {
    status = "BAD";
}

void causeException() throws Exception() {
    throw new Exception();
}

这会导致重新分配变量,这就是您收到错误的原因