java中编译期间的变量初始化错误

时间:2015-10-16 08:56:04

标签: java

我有两个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);
    }
}

输出: - 蓝色

我的问题是,因为两个程序几乎相似,为什么我变量可能没有被初始化?

如果第一个程序出现问题,第二个程序是否也应该抛出相同的错误?

6 个答案:

答案 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)

在第一个代码片段中,虽然从逻辑角度讲必须发生ifelse,但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缺失。