我在 if 语句之外声明我的对象,但在其中初始化它们。后来我尝试使用它们,但它不允许,因为它们还没有被初始化。if 语句的结构使得它们都将在使用对象之前执行,因此将保证初始化对象,但 java 不允许这样做。有什么办法吗?
4 回答
如果您知道所有路径最终都会初始化它们,但编译器不会,您可以在声明它们时将它们初始化为null
or 0
(false
正如 ajb 有用地提醒的那样) - 或您定义的其他一些特殊初始值。然后它们有一个具体的初始值。
如果变量在您使用它时仍然存在null
(或者它的初始值是什么)(在对象的情况下可能由 NPE 证明),那么您就知道出了问题;您还可以稍后使用断言自行记录您的假设。
您应该发布您的代码,以便我们为您提供更好的建议;编译器在路径分析方面相对聪明,尽管它当然不能处理依赖外部输入或假定的先决条件和不变量的情况。尽管如此,您总是有可能忽略了某些东西(也许异常或意外情况会导致值未初始化的路径 - 这很好,您只需要确保它已初始化)。
在条件表达式之后保证对象初始化的唯一方法是是否存在始终执行的分支,例如else
语句或语句default
中switch
。
要分解它,请使用以下示例代码:
String word;
String name = "Peter";
if("Peter".equals(name)) {
word = "The Bird";
}
System.out.println(word);
这将失败,因为编译器识别出word
未初始化的分支。
如果你添加一个else
子句,那么编译器会认为它word
已经初始化。
String word;
String name = "Peter";
if("Peter".equals(name)) {
word = "The Bird";
} else {
word = "Nope";
}
System.out.println(word);
Java 要求变量在其值被引用之前沿所有可能的路径初始化到使用点。例如,如果你有
int x;
if (a == b) {
x = 5;
}
if (c == d) {
x = 6;
}
int y = x;
在上述情况下,编译器无法知道第一条或第二条if
语句是否为真,因此不确定是否x
会沿着导致分配到的所有路径分配一个值y
。因此编译器将不允许这样做(并且,如果编译器没有拒绝这一点,JVM 内的“验证器”会这样做)。
解决方案是为变量分配一个值(在这种情况下可能是零或 -1,null
用于对象引用),以便知道它在所有路径上都有一个值。
但请注意,您可能不应该只为您声明的每个变量分配一个虚拟值,因为通常没有分配值的编译器消息可能表明您不小心忽略了为变量分配值的实际代码错误小路。
将它们初始化为 null
Object myAwesomesauceVariableOfAwesome = null;
if(myUnbelievablyWildBoolean){
myAwesomesauceVariableOfAwesome = getAwesomesauce();
}
doSomethingCompletelyMindBlowingWithAwesomesauce(myAwesomesauceVariableOfAwesome);