除了上一个方法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))
答案 0 :(得分:5)
如果您的if
条件都不成立,则该方法不会返回任何内容
编译器的可达性分析不够聪明,不能意识到bool
必须始终是true
或false
(特别是因为那不是真的)
您可以通过从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;
}
}
如果if
和else-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