2017-10-14 99 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塊將無法達成。如果不是這種情況,當您處於書包大小不是「小」,「中等」等狀態時,每次輸入此函數時都會有無窮遞歸,因爲您將無法更改狀態,並退出這些電話了。