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