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

时间:2018-04-23 09:19:15

标签: java static initialization final static-initializer

我正在尝试初始化一个静态最终变量。但是,这个变量在一个可以抛出异常的方法中初始化,因此,我需要在try catch块中。

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

  

可能已经指定了最后一个字段

这是我的代码:

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");
  }

}

我尝试了另一种方法,直接将其声明为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");
  }

}

对此有优雅的解决方案吗?

4 个答案:

答案 0 :(得分:4)

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

private static final String a;

static {

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

}

这确保了对final变量的单一分配。

答案 1 :(得分:1)

最终变量只能设置一次。

您不能(也不需要)将a设置为null块中的catch

进行以下更改:

public class TestClass {


      private static final String a = setupField();

      private static String setupField() {
        String s = "";
        try {
            s = fn();
        } catch (Exception e) {
          // Log the exception, etc.
        }
        return s;
      }

      private static String fn() throws Exception {
        return "Desired value here";
      }

答案 2 :(得分:0)

private static final String a = null;

最终属性仅初始化一次。无论是在构造函数中还是在此处执行的方式。你不能给出一个'给它赋值null后的新值。如果你没有决赛,你可以通过fn函数设置值

答案 3 :(得分:0)

因为final变量只能分配一次而且无法重新分配。

try/catch

无关