2017-10-14 83 views
-1

因此,我在Java中创建一个Helper方法来根据大小计算邮资,但我似乎无法弄清楚返回部分。即时通讯仍然是新的辅助方法和访问等我使用Eclipse和它告诉我“添加返回语句”,但我做了..我在这里做错了什么?在Java中创建帮助器方法

这里是我的代码:

//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(); 

    } 
} 
+1

有条件分支没有值将被返回。 – byxor

+2

你只'return'在'else'情况下(这将导致一个无限循环,因为它使一个递归调用,而不改变任何东西)。 – jonrsharpe

+0

这里@jonrsharpe它只是一个JavaNatzi,但循环不会是无限的 - 它会导致堆栈溢出(并终止:)) – Antoniossss

回答

0

的问题是,您return语句else语句的范围内,应该是外面这样的:`

公众诠释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()创建一个递归循环导致的堆栈溢出。

+0

循环将是有限的返回变量 - 这将导致堆栈溢出,并终止 – Antoniossss

-1

您必须在每种可能的情况下返回价值。现在你正在返回(无限递归,因此发生溢出将会发生)只有单一的情况下,如果包不小,不中等或不大。你必须为每一个这种变体的返回值,这样的:

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 
    } 
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 ; 
} 
+0

你知道,可能会导致StackOverflow的? – Antoniossss

+0

@Antoniossss哦!我的错。更新了安装程序。谢谢你纠正我。 –

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

(据我所知,严格说来,这不回答你的问题“为什么不这样编译”。)

0

的问题是,你不会在函数的末尾有保证的return语句。如果你的函数没有遇到一个“小”,“中等”的书包大小,你会返回你函数calculatePostageCost返回的值(我将在稍后返回)。

但是,在其他任何情况下,您的函数中都没有返回值。当你遇到“小”作为书包大小时,你输入第一个if block的代码,在那里你将postCost设置为10,然后跳过其余的代码(因为它是所有其他的if)。

很可能你错过了像else块之下的return postCode;这样的语句。这至少会消除来自eclipse的错误消息。我不完全确定你的代码,但你可以在这里进行无限的递归。你else块可能是一个问题:

else { 
    return calculatePostageCost(); 
} 

您需要检查,如果有可能,在这个递归的下一次调用,else块将无法达成。如果不是这种情况,当您处于书包大小不是“小”,“中等”等状态时,每次输入此函数时都会有无穷递归,因为您将无法更改状态,并退出这些电话了。