5

我正在尝试初始化一个静态最终变量。但是,这个变量是在一个可以抛出异常的方法中初始化的,因此,我需要在一个 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");
  }

}

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

4 回答 4

9

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

private static final String a;

static {

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

}

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

于 2018-04-23T09:22:44.787 回答
1

最终变量只能设置一次。

您不能(也不需要)在块中设置a为。nullcatch

进行以下更改:

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";
      }
于 2018-04-23T09:28:41.943 回答
0

这是因为final变量只能分配一次,并且不能再次重新分配。

没有任何关系try/catch

于 2018-04-23T09:24:18.483 回答
0

私有静态最终字符串 a = null;

最终的属性只初始化一次。无论是在构造函数中还是您在此处执行的方式中。给“a”一个新值后,你不能给它一个新值。如果您没有最终结果,您可以通过 fn 函数设置值

于 2018-04-23T09:23:09.350 回答