此方法必须返回int类型的结果 -

时间:2013-11-10 16:57:59

标签: java eclipse class methods this

除了上一个方法getPrice()我正在返回int之外,一切正常。但我一直得到同样的错误。此外,如果我将保修设置为假,它仍会返回(基数+((基数/ 100)* 10))

public class Machinery extends SaleGroup {

private float serial;
public int base;
private static boolean hasWarranty;

public Machinery(String newItemDescription, float newProductCode,
        float newSerial, int newBasePrice) {

    super(newItemDescription, newProductCode);
    serial = newSerial;
    base = newBasePrice;

}

public boolean IncludeWarranty() {
    return hasWarranty=true;
}

public boolean ExcludeWarranty() {
    return hasWarranty=false;
}

public float getSerial() {
    return serial;
}



public int getPrice()
    {
        if (hasWarranty==true)
        {
            return (base+((base/100)*10));
        } 
        else if (hasWarranty==false) 
        {
            return base;
        }
    }
}

我有3个类,SaleGroup.java,Machinery.java和MachineryTest.java

public abstract class SaleGroup {

     private String item;
     private float code;

     //Constructor with name and code parameters for specifying 
     //access methods that return the name and code
     public SaleGroup(String newItemDescription, float newProductCode)
     {
          item = newItemDescription;
          code = newProductCode;
     }

     public String getItemDescription() 
     {
          return item;
     }

     public float getProductCode() 
     {
          return code;
     }

     public abstract int getPrice();

     public String toString()
     {
          return "Item " + item + "has product code " + code + " and price is" + getPrice();
     }

}

MachineryTest.java

import javax.swing.JOptionPane;
public class MachineryTest {
    public static void main(String[] args) {
        String newItemDescription = "Item";
        float newSerial = 4234;
        float newProductCode = 3424;
        int newBasePrice = 1000;
        boolean hasWarranty=true;

        Machinery test1 = new Machinery(newItemDescription, newProductCode,
                newSerial, newBasePrice);
        JOptionPane.showMessageDialog(
                null,
                "Item: " + test1.getItemDescription() + " Serial: "
                        + test1.getSerial() + " Code: "
                        + test1.getProductCode() + " Warranty Included: "
                        + hasWarranty + " Price " + test1.getPrice());
    }
}

* 更新:*

除了最后一个方法getPrice()之外,一切正常。我返回int但是我一直得到同样的错误。此外,如果我将保修设置为假,它仍会返回(基数+((基数/ 100)* 10))

6 个答案:

答案 0 :(得分:5)

如果您的if条件都不成立,则该方法不会返回任何内容 编译器的可达性分析不够聪明,不能意识到bool必须始终是truefalse(特别是因为那不是真的)

您可以通过从if子句中删除else来解决此问题 当你在它时,你也可以删除== true部分,这是无用的。

答案 1 :(得分:1)

问题是编译器无法解决这个问题:

if (hasWarranty == true) {
   ...
} else if (hasWarranty == false) {
   ...
}

将始终执行这些路径的一个。它认为你可以在没有任何brance的情况下到达if语句的末尾,这意味着你可以在不返回任何内容的情况下到达方法的末尾。实际上,hasWarranty可以false开始,然后在执行第二个条件之前将另一个线程更改为true

你可以删除第二个条件:

if (hasWarranty == true)  {
    ...
} else {
    ...
}

您还可以删除与布尔文字的比较:

if (hasWarranty) {
    ...
} else {
    ...
}

您还应该考虑使用条件运算符

public int getPrice() {
    return hasWarranty ? base + ((base/100) * 10) : base;
}

答案 2 :(得分:0)

public int getPrice()
{
    if (hasWarranty==true)
    {
         return (base+((base/100)*10));
    }
    else {
         return base;
    }
}

如果您已经在测试真实案例,则else会自动成为虚假案例。只有两种可能的情况,真假。这样编译知道总会有返回的东西。如果你的代码,编译不知道代码是否会返回任何东西,因为返回是用条件封装的。

答案 3 :(得分:0)

添加到SLaks回答只需更改这样的代码,即可成功编译:

 if (hasWarranty)
 {
      return (base+((base/100)*10));
 }
 else 
 {
      return base;
 }

第二个if是多余的。

答案 4 :(得分:0)

public int getPrice()
{
     if (hasWarranty==true)
     {
          return (base+((base/100)*10));
     }
     else if (hasWarranty==false) {
          return base;

     }
}

如果ifelse-if都是false,则该函数无法评估返回任何内容,无法评估其中任何一个true直到运行时。因此,函数体getPrice()可以正常完成,并产生编译时错误。

这在jls-8.4.7 Method body中指定:

  

如果声明方法具有返回类型,则编译时   如果方法的主体可以正常完成,则发生错误。在   换句话说,具有返回类型的方法必须仅使用a返回   提供值返回的return语句;不允许这样做   “放下身体的末端”

所以:

public int getPrice()
    {
         if (hasWarranty==true)
         {
              return (base+((base/100)*10));
         }

       return base;
    }

答案 5 :(得分:0)

编译器不知道第二个if语句是多余的且没有意义。通常,如果代码混淆了编译器,它的混乱代码。你可以写

public int getPrice() {
     if (hasWarranty==true) {
          return (base+((base/100)*10));
     }
     return base;
}

public int getPrice() {
     return base + (hasWarranty ? (base/100)*10 : 0);
}

BTW /100*10*10/100/10不一样我怀疑你想增加10%,最好的办法是base/10

public int getPrice() {
     return base + (hasWarranty ? base/10 : 0);
}

使用getPrice()方法并不会神奇地更改base字段。如果您想要调用方法所需的价格。

public class Priced {
    int base = 1000;
    boolean hasWarranty = true;

    public static void main(String[] args) {
        final Priced priced = new Priced();
        System.out.println("price: " + priced.getPrice() + ", hasWarranty: " + priced.hasWarranty);
        priced.hasWarranty = false;
        System.out.println("price: " + priced.getPrice() + ", hasWarranty: " + priced.hasWarranty);
    }

    public int getPrice() {
        return base + (hasWarranty ? base / 10 : 0);
    }
}

打印

price: 1100, hasWarranty: true
price: 1000, hasWarranty: false