0

除了getPrice()我返回的最后一种方法外,一切都运行良好,int但我一直收到同样的错误。此外,如果我将保修设置为假,它仍会返回 (base+((base/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();
     }

}

机械测试.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());
    }
}

*更新:*

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

4

6 回答 6

5

如果您的if条件都不成立,则该方法将不会返回任何内容。
编译器的可达性分析不够聪明,无法意识到bools 必须始终是trueor false(尤其是因为这不太正确)

您可以通过ifelse子句中删除来解决此问题。
当您使用它时,您还可以删除== true无用的部分。

于 2013-11-10T16:59:43.333 回答
1

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

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

将始终执行这些路径之一。它认为您可能会在if不使用任何一个分支的情况下到达语句的结尾,这意味着您可以在不返回任何内容的情况下到达方法的结尾。事实上,在执行第二个条件之前,可能会先是hasWarrantyfalse然后另一个线程将其更改为。true

您可以删除第二个条件:

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

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

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

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

public int getPrice() {
    return hasWarranty ? base + ((base/100) * 10) : base;
}
于 2013-11-10T17:02:18.587 回答
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);
}

顺便说一句/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
于 2013-11-10T17:04:22.400 回答
0
public int getPrice()
{
    if (hasWarranty==true)
    {
         return (base+((base/100)*10));
    }
    else {
         return base;
    }
}

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

于 2013-11-10T17:00:29.117 回答
0

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

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

if是冗余。

于 2013-11-10T17:01:24.027 回答
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中指定:

如果将方法声明为具有返回类型,则如果方法的主体可以正常完成,则会发生编译时错误。换句话说,具有返回类型的方法必须仅通过使用提供值返回的 return 语句返回;不允许 “掉头”

所以:

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

       return base;
    }
于 2013-11-10T17:02:38.893 回答