用Java创建一个Helper方法

时间:2017-10-14 09:34:37

标签: java

所以我在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();

    }
}

5 个答案:

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