所以我在Java中创建一个Helper方法来根据大小来计算邮资,但我似乎无法弄清楚返回部分。我仍然是辅助方法和访问器等新手。我使用Eclipse并告诉我“添加返回语句”但我做了..我在这里做错了什么?
这是我的代码:
//Helper Method.
public int calculatePostageCost() {
double postCost;
if(satchelSize.equals("small"))
postCost = 10;
else if(satchelSize.equals("Medium") || satchelSize.equals("medium"))
postCost = 13;
else if(satchelSize.equalsIgnoreCase("Large") || satchelSize.equals("large"))
postCost = 17;
else {
return calculatePostageCost();
}
}
答案 0 :(得分:0)
问题是你的return语句在else语句的范围内,它应该是这样的:`
public int calculatePostageCost() {
double postCost;
if(satchelSize.equals("small"))
postCost = 10;
else if (satchelSize.equals("Medium") || satchelSize.equals("medium")){
postCost = 13;
else if(satchelSize.equalsIgnoreCase("Large") || satchelSize.equals("large"))
postCost = 17;
return postCost;
}
如果返回calculatePostageCost(),则会创建一个递归循环,导致堆栈溢出错误。
答案 1 :(得分:0)
这样做,
//Helper Method.
public int calculatePostageCost() {
int postCost = 5; // i don't know about default conndition, i am taking 5
if(satchelSize.equals("small"))
postCost = 10;
else if(satchelSize.equals("Medium") || satchelSize.equals("medium"))
postCost = 13;
else if(satchelSize.equalsIgnoreCase("Large") || satchelSize.equals("large"))
postCost = 17;
}
return postCost ;
}
答案 2 :(得分:0)
请勿使用字符串来比较您的尺寸,请创建enum
来执行此操作:
public enum Size {
SMALL, MEDIUM, LARGE
}
private Size satchelSize; ....
public int calculatePostageCost() {
switch(satchelSize) {
case SMALL:
return 10;
case MEDIUM:
return 13;
case LARGE:
return 17;
}
}
如果你非常热衷于保留字符串,你也可以在字符串上switch
:
private String stachelSize = ....;
public int calculatePostageCost() {
switch(satchelSize.toUpperCase()) {
case "SMALL":
return 10;
case "MEDIUM":
return 13;
case "LARGE":
return 17;
default:
throw new AssertionError("Don't know satchel size " + satchelSize);
}
}
请注意您的原始代码
else {
return calculatePostageCost();
}
哪个会再次调用相同的函数,这将最终在同一个else
分支中,再次调用相同的函数,这将最终在同一个else
分支中,...最终会给出StackOverflowException
。
(据我所知,严格来说,它没有回答你的问题'为什么不编译这个问题。)
答案 3 :(得分:0)
问题是您在函数末尾没有保证的return语句。如果你的函数没有遇到一个“小”,“中等”的书包大小会发生什么,你将返回你的函数calculatePostageCost
返回的值(稍后我将返回)。
但是,在其他所有情况下,您的功能都没有返回。当您遇到“小”作为书包大小时,您输入第一个if block
代码,您将postCost
设置为10,然后跳过其余代码(因为它是其他所有代码)。
很可能你错过了else块下方return postCode;
之类的语句。这至少可以消除eclipse的错误信息。我不完全确定你的代码,但你可以在这里进行无休止的递归。你的else块可能是个问题:
else {
return calculatePostageCost();
}
您需要检查是否可能,在下次调用此递归时,将无法访问else块。如果不是这种情况,那么当您处于书包大小不是“小”,“中等”等状态时,每次进入此功能时都会有无尽的递归,因为您没有机会改变国家,并退出这些电话。
答案 4 :(得分:-1)
您必须在每种可能的情况下返回值。现在你正在返回(无限递归,因此stak溢出将发生)只有单个,如果包不小而不是中等也不大。您必须为每个变体返回值,例如:
public int calculatePostageCost() {
int postCost=1234; // default cost for not small nor medium nor large package
if(satchelSize.equals("small"))
postCost = 10;
else if(satchelSize.equals("Medium") || satchelSize.equals("medium"))
postCost = 13;
else if(satchelSize.equalsIgnoreCase("Large") || satchelSize.equals("large"))
postCost = 17;
return postCode
}
甚至更好
public int calculatePostageCost() {
if(satchelSize.equalsIgnoreCase("small"))
return 10;
else if(satchelSize.equalsIgnoreCase("Medium"))
return 13
else if(satchelSize.equalsIgnoreCase("Large"))
return 17;
return 12345; // cos of non small, medium nor large package
}