我有两个Java程序。
计划一
class Ideone
{
public static void main (String[] args)
{
double price = 10;
String model;
if (price > 10)
model = "Smartphone";
else if (price <= 10)
model = "landline";
System.out.println(model);
}
}
输出: - 变量模型可能尚未初始化(错误)
计划二: -
class Ideone
{
public static void main (String[] args)
{
double area = 10.98;
String color;
if (area < 5)
color = "red";
else
color = "blue";
System.out.println(color);
}
}
输出: - 蓝色
我的问题是,因为两个程序几乎相似,为什么我变量可能没有被初始化?
如果第一个程序出现问题,第二个程序是否也应该抛出相同的错误?
答案 0 :(得分:4)
编译器非常聪明。
在第二种情况下,您完全填写所有条件。在所有条件之后还有其他部分可以保存。
但在你的第一个案例中没有其他部分。这意味着如果没有条件通过,那么你有一个空白字段。
您必须提供确保初始化部分
的其他内容double price = 10;
String model;
if (price > 10)
model = "Smartphone";
else if (price <= 10)
model = "landline";
else
model = null
或提供默认值null或您想要的。
double price = 10;
String model =null;
if (price > 10)
model = "Smartphone";
else if (price <= 10)
model = "landline";
答案 1 :(得分:4)
在第一种情况下,将else if
更改为else
。 Java编译器不够聪明,无法意识到两个条件中的一个将被100%执行。
答案 2 :(得分:2)
在第一个代码片段中,虽然从逻辑角度讲必须发生if
或else
,但Java编译器并不“知道”这个。它假设两个 if
语句都可能失败,因此会给出警告消息。以下是代码中发生的情况的细分:
double price = 10;
String model;
if (price > 10)
model = "Smartphone";
else if (price <= 10) // the Java compiler doesn't "know" that one
model = "landline"; // of these two cases will always occur
System.out.println(model);
如果您将代码更改为以下内容,则不会再收到此警告:
double price = 10;
String model;
if (price > 10)
model = "Smartphone";
else {
model = "landline"; // in case the if fails, this else will ALWAYS
System.out.println(model); // happen, so 'model' is guaranteed to get
} // intiailized
在第二个代码段中,您使用显式if-else
进行初始化,因此编译器在这一点上保持沉默。
答案 3 :(得分:1)
问题在于,在您的第一个程序中,您可以看到您使用了if-else if
语句,编译器无法确定这些条件是评估为true还是false ,导致变量的非初始化,因此您得到错误。
但是在你的第二个程序中你可以看到,你使用了if-else语句,所以在这种情况下,编译器知道,如果if条件不满足那么它(编译器)可以执行else语句并给出对可变的价值。
所以只需将它放在你的第一个程序中
String model;
if (price > 10)
model = "Smartphone";
else
model = "landline";
System.out.println(model);
我删除了else-if 的if部分只是为了让你知道我做了什么
答案 4 :(得分:1)
在第一种情况下,您需要初始化,因为如果两个条件都为假(if和else if)那么将显示什么是默认值。 在你的第一个代码中添加一个else部分,它不会发出这样的警告。
在第二种情况下,当第一部分(if(condition)== false)时,else部分将被执行,因此没有这样的条件,变量颜色不会有任何值。
答案 5 :(得分:0)
我的问题是,由于两个程序几乎相似,为什么 我变量可能没有被初始化?
实际上他们不一样。您的字段名称model
未初始化为:
String model = null;
编译器正在考虑未被任何if条件初始化的情况,这就是它抱怨的原因。在第一种情况下,else
缺失。