无法在 try/catch 中初始化静态最终变量
can not initialize static final variable in try/catch
我正在尝试初始化一个静态最终变量。但是,这个变量是在一个可以抛出异常的方法中初始化的,因此,我需要在一个 try catch 块中。
即使我知道变量将在 try 或 catch 块上初始化,java 编译器也会产生错误
The final field a may already have been assigned
这是我的代码:
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,但它显示了类似的错误(在这种情况下,这对我来说似乎完全合乎逻辑)
The final field TestClass.a cannot be assigned
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");
}
}
有没有优雅的解决方案?
可以先赋值给局部变量,然后在try
-catch
块之后赋值给final
变量:
private static final String a;
static {
String value = null;
try {
value = fn();
} catch (Exception e) {
}
a = value;
}
这确保了对 final
变量的单一赋值。
private static final String a = null;
最终属性只初始化一次。在构造函数中或您在此处执行的方式。在给 'a' 赋值为 null 后,您不能再给它一个新值。如果你没有 final 你可以通过 fn 函数设置值
因为final
变量只能赋值一次,不能再赋值。
与try/catch
无关
最终变量只能设置一次。
您不能(也不需要)在 catch
块中将 a
设置为 null
。
进行以下更改:
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";
}
我正在尝试初始化一个静态最终变量。但是,这个变量是在一个可以抛出异常的方法中初始化的,因此,我需要在一个 try catch 块中。
即使我知道变量将在 try 或 catch 块上初始化,java 编译器也会产生错误
The final field a may already have been assigned
这是我的代码:
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,但它显示了类似的错误(在这种情况下,这对我来说似乎完全合乎逻辑)
The final field TestClass.a cannot be assigned
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");
}
}
有没有优雅的解决方案?
可以先赋值给局部变量,然后在try
-catch
块之后赋值给final
变量:
private static final String a;
static {
String value = null;
try {
value = fn();
} catch (Exception e) {
}
a = value;
}
这确保了对 final
变量的单一赋值。
private static final String a = null;
最终属性只初始化一次。在构造函数中或您在此处执行的方式。在给 'a' 赋值为 null 后,您不能再给它一个新值。如果你没有 final 你可以通过 fn 函数设置值
因为final
变量只能赋值一次,不能再赋值。
与try/catch
无关
最终变量只能设置一次。
您不能(也不需要)在 catch
块中将 a
设置为 null
。
进行以下更改:
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";
}