无法在try / catch中初始化静态最终变量

May*_*day 3 java static final initialization static-initializer

我正在尝试初始化静态最终变量。但是,此变量是在可能引发异常的方法中初始化的,因此,我需要在try catch块内使用。

即使我知道变量将在try或catch块上初始化,Java编译器也会产生错误

最终字段a可能已经分配

这是我的代码:

public class TestClass {

  private static final String a;

  static {
    try {
      a = fn(); // ERROR
    } catch (Exception e) {
      a = null;
    }
  }

  private static String fn() throws Exception {
    throw new Exception("Forced exception to illustrate");
  }

}
Run Code Online (Sandbox Code Playgroud)

我尝试了另一种方法,直接将其声明为null,但它显示了类似的错误(在这种情况下,对我来说似乎完全合乎逻辑)

无法分配最终字段TestClass.a

public class TestClass {

  private static final String a = null;

  static {
    try {
      a = fn(); // ERROR
    } catch (Exception e) {
    }
  }

  private static String fn() throws Exception {
    throw new Exception("Forced exception to illustrate");
  }

}
Run Code Online (Sandbox Code Playgroud)

是否有一个优雅的解决方案?

Era*_*ran 5

您可以先将值分配给局部变量,然后finaltry- catch块之后将其分配给变量:

private static final String a;

static {

    String value = null;
    try {
        value = fn();
    } catch (Exception e) {
    }
    a = value;

}
Run Code Online (Sandbox Code Playgroud)

这样可以确保对final变量进行一次分配。