我在if语句之外声明我的对象,但是在它内部初始化它们。后来我尝试使用它们,但它不允许它,因为它们尚未初始化。 if语句的结构使得它们都将在使用对象之前执行,因此对象将被保证初始化,但java不允许这样做。有什么方法吗?
答案 0 :(得分:2)
如果您知道所有路径最终都会初始化它们,但编译器没有,那么您可以将它们初始化为null
或0
或false
(如ajb帮助提醒) - - 或者在声明它们时定义的其他一些特殊初始值。然后他们有一个具体的初始值。
如果变量在你使用它的时候仍然是null
(或者它的初始值是什么)(在对象的情况下可能由NPE证明)那么你就知道出了什么问题;你也可以稍后用断言自我记录你的假设。
您应该发布您的代码,以便我们为您提供更好的建议;编译器在路径分析方面比较聪明,当然,它不能处理依赖于外部输入或假设的前置条件和不变量的情况。尽管如此,你总是可能忽略了某些东西(可能是异常或意外情况导致价值未初始化的路径 - 这很好,你只需要确保它被初始化)。
答案 1 :(得分:1)
在条件表达式之后,如果存在始终执行的分支,例如else
语句或default
in,则仅方式保证对象的初始化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);
答案 2 :(得分:1)
Java要求在引用其值之前,将所有可能路径的变量初始化到使用点。例如,如果你有
int x;
if (a == b) {
x = 5;
}
if (c == d) {
x = 6;
}
int y = x;
在上面的例子中,编译器无法知道第一个或第二个if
语句是否为真,因此不确定x
是否在所有路径上分配了一个值,导致赋值给y
。所以编译器将不允许这样做(并且,如果编译器没有拒绝这个,那么JVM中的“验证器”)。
解决方案是为变量赋值(在这种情况下可能为零或-1,对象引用为null
),以便知道所有路径都有值。
但是请注意,您可能不应该只为您声明的每个变量分配一个虚拟值,因为通常编译器消息没有分配任何值可以指示一个真实的实时代码错误,其中您不小心忽略了为其分配值在一些路径上变量。
答案 3 :(得分:0)
将它们初始化为null
Object myAwesomesauceVariableOfAwesome = null;
if(myUnbelievablyWildBoolean){
myAwesomesauceVariableOfAwesome = getAwesomesauce();
}
doSomethingCompletelyMindBlowingWithAwesomesauce(myAwesomesauceVariableOfAwesome);