2013-10-18 49 views
1

該程序使用3種不同的方法來玩擲骰子。我需要在玩擲骰子的幫助,但我需要有這3種不同的方法,但由於某種原因,我每次編譯我收到此錯誤時間:編譯錯誤:缺少返回語句

CrapsAnalysis.java:48: error: missing return statement 
    } 
    ^
1 error 
Process javac exited with code 1 

代碼:

public class CrapsAnalysis 
{ 
public static int rollDie(int n) { 
    return (int)(Math.random()*n) + 1 ; 
} 
public static int rollDice() { 
    return rollDie(6) + rollDie(6) ; 
} 
public static boolean playOneGame() { 
    int newDice = rollDice(); 
    int roll = rollDice(); //first roll of the dice 
    int playerPoint = 0; //player point if no win or loss on first roll 
    if (roll == 7 || roll == 11) 
     return true; 
    else if (roll == 2 || roll == 3 || roll == 12) 
     return false; 
    else  
     playerPoint = roll; 
    do { 
     if (rollDice() == 7) 
      return false; 
     else if (rollDice() == playerPoint) 
      return true; 
     else 
      newDice = rollDice(); 
     } while (rollDice() != playerPoint || rollDice() != 7) ; 
    } 
} 
+1

你需要在你的程序 – Prateek

回答

2

你只有return語句位於if塊的正文內。

編譯器不知道是否有任何這些if塊會被到達,所以它給你一個錯誤。

你可能想在最後

} while (rollDice() != playerPoint || rollDice() != 7) ; 
    return false; 
} 

我假設,如果默認return語句以往任何時候都實際上得到執行,比它的錯誤狀態有一個默認的return語句,你應該做出相應的反應。

+0

那麼我現在要做的是,如果這兩個條件不工作的任何東西都不會做骰子滾一遍爲每一位執行路徑的回報。應該是什麼樣的回報聲明? –

5

Java必須查看所有執行路徑。如果while循環結束而沒有返回任何內容會發生什麼?你可能在邏輯上阻止了這一點,但Java編譯器不會做這種分析。

while循環結束後提供一個return聲明,或拋出某種類型的ExceptionIllegalStateException?)如果代碼真的不應該永遠做它。

0

在您的while循環之後,您需要一個return語句,因爲if/else語句可能會或可能不會被執行。如果他們都沒有執行,你就沒有回報。因此,您需要確保至少會有一個可以始終執行的返回語句。

public static boolean playOneGame() { 
    int newDice = rollDice(); 
    int roll = rollDice(); //first roll of the dice 
    int playerPoint = 0; //player point if no win or loss on first roll 

    if (roll == 7 || roll == 11) 
     return true; 
    else if (roll == 2 || roll == 3 || roll == 12) 
     return false; 
    else  
     playerPoint = roll; 
     do { 
      if (rollDice() == 7) 
       return false; 
      else if (rollDice() == playerPoint) 
       return true; 
      else 
       newDice = rollDice(); 
     } while (rollDice() != playerPoint || rollDice() != 7) ; 
    return false; 
} 

此外,爲清楚起見,我重新安排你的if/else語句,因此更容易閱讀。您也可能想養成這樣做的習慣,以便其他人可以更容易地理解您的代碼。

2

你在你的,而塊缺少return

public static boolean playOneGame() { 
    int newDice = rollDice(); 
    int roll = rollDice(); //first roll of the dice 
    int playerPoint = 0; //player point if no win or loss on first roll 

    if (roll == 7 || roll == 11) 
     return true; 
    else if (roll == 2 || roll == 3 || roll == 12) 
     return false; 
    else  
     playerPoint = roll; 
     do { 
      if (rollDice() == 7) 
       return false; 
      else if (rollDice() == playerPoint) 
       return true; 
      else 
       newDice = rollDice(); 

} while (rollDice() != playerPoint || rollDice() != 7) 
    **// You are missing a return statement here.**; 
2
public static boolean playOneGame() { 
    int newDice = rollDice(); 
    int roll = rollDice(); //first roll of the dice 
    int playerPoint = 0; //player point if no win or loss on first roll 

    if (roll == 7 || roll == 11) 
     return true; 
    else if (roll == 2 || roll == 3 || roll == 12) 
     return false; 
    else  
     playerPoint = roll; 
     do { 
      if (rollDice() == 7) 
       return false; 
      else if (rollDice() == playerPoint) 
       return true; 
      else 
       newDice = rollDice(); 
     } while (rollDice() != playerPoint || rollDice() != 7) ; 
     return SOMETHING HERE; 
} 

你應該看看一致的代碼格式。不僅對我們而言,對於你自己也是如此,所以當你在幾周後查看這段代碼時,你仍然可以閱讀它。

3

您可以將您的代碼之後添加的最後一個return語句是這樣的:

public static boolean playOneGame() { 
    int newDice = rollDice(); 
    int roll = rollDice(); // first roll of the dice 
    int playerPoint = 0; // player point if no win or loss on first roll 

    if (roll == 7 || roll == 11) 
     return true; 
    else if (roll == 2 || roll == 3 || roll == 12) 
     return false; 
    else 
     playerPoint = roll; 
    do { 
     if (rollDice() == 7) 
      return false; 
     else if (rollDice() == playerPoint) 
      return true; 
     else 
      newDice = rollDice(); 
    } while (rollDice() != playerPoint || rollDice() != 7); 

    return false; 
} 

這將使編譯您的代碼仍然可以工作。

2

當您必須添加退貨時,請確保您爲每個可能的執行路徑添加return添加default return語句。你程序中遺漏二者

public class CrapsAnalysis 
     { 
      public static int rollDie(int n) { 
       return (int)(Math.random()*n) + 1 ; 
      } 
      public static int rollDice() { 
      return rollDie(6) + rollDie(6) ; 
      } 
      public static boolean playOneGame() { 
       int newDice = rollDice(); 
       int roll = rollDice(); //first roll of the dice 
       int playerPoint = 0; //player point if no win or loss on first roll 

       if (roll == 7 || roll == 11) 
       return true;<--- Works 
       else if (roll == 2 || roll == 3 || roll == 12) 
        return false;<--- Works 
       else  
        playerPoint = roll; 
        do { 
        if (rollDice() == 7) 
        return false;<--- Works 
        else if (rollDice() == playerPoint) 
        return true;<--- Works 
        else 
        newDice = rollDice();  
      } while (rollDice() != playerPoint || rollDice() != 7) ; 
    //No return here. You need to add a default return if none of the conditions above satisfies 
     } 
     } 
+0

所以我想要做的是如果兩個條件不工作,其他任何事情都會使骰子再次滾動。應該是什麼樣的回報聲明? –

+0

沒有什麼只是在'do-while'循環後添加'default return'語句來告訴編譯器,如果沒有任何工作'return false' – Prateek

1

這裏是你的代碼非常精簡的版本:

public static boolean playOneGame() 
{ 
    if(condition1 == true) 
    { 
     //code1 
     return true; 
    } 
    else if(condition2 == true) 
    { 
     //code2 
     return false; 
    } 
    else 
    { 
     //code3 
    } 
    //code4 
} 

如果condition1condition2是真實的,playOneGame()將返回假非真。但是,如果condition1condition2,是假,將運行的唯一代碼CODE3。 code3不包含return語句,所以在理論上playOneGame()不會返回任何內容。 知道condition1condition2永遠都是假的,但Java編譯器沒有,所以它拋出一個編譯器錯誤。如果沒有拋出一個編譯器錯誤和condition1condition2某種程度上都成爲虛假的,它會引發運行時錯誤。運行時錯誤比編譯器錯誤更難調試,所以編譯器通過拋出一個易於修復的錯誤來幫助你。

要解決缺少return語句,添加return語句CODE3或碼4。