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) ;
    }
}
4

8 回答 8

5

Java 必须查看所有执行路径。如果while循环结束而不返回任何内容会发生什么?您可能在逻辑上阻止了这种情况,但 Java 编译器不会进行这种分析。

return在循环结束后提供一个语句,或者如果代码真的不应该在那里出现,则while抛出某种Exception( ?)。IllegalStateException

于 2013-10-18T19:59:03.047 回答
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;
}

它将使它编译并且您的代码仍然可以工作。

于 2013-10-18T20:01:05.980 回答
2

您只有return语句在if块的主体内。

编译器不知道是否会到达这些 if 块中的任何一个,因此它会给您一个错误。

您可能希望最后有一个默认的 return 语句

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

我假设如果该默认返回语句实际上被执行,那么它是一个错误状态,你应该做出相应的反应。

于 2013-10-18T19:58:55.677 回答
2

return您在 while 块 中缺少一个:

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.**;
于 2013-10-18T20:00:21.847 回答
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;
}

您应该研究一致的代码格式。不仅对我们,对您自己也是如此,所以当您在几周后查看此代码时,您仍然可以阅读它。

于 2013-10-18T20:00:56.670 回答
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
        }
        }
于 2013-10-18T20:02:32.767 回答
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()不会返回任何内容。知道这一点condition1并且condition2永远不会都是假的,但是 java 编译器不会,所以它会抛出一个编译器错误。如果它没有抛出编译器错误并且condition1不知condition2何故都变成了假,它会抛出一个运行时错误。运行时错误比编译器错误更难调试,因此编译器通过抛出一个易于修复的错误来帮您一个忙。

要修复缺少的 return 语句,请将 return 语句添加到 code3 或 code4。

于 2013-10-18T20:19:56.467 回答
0

在您的 while 循环之后,您需要一个 return 语句,因为 if/else 语句可能会或可能不会被执行。如果他们都没有执行,你就没有回报。因此,您需要确保至少有一个可以始终执行的 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;
}

此外,为了清楚起见,我重新排列了您的 if/else 语句,以便于阅读。您可能还想养成这样做的习惯,以便其他人可以更轻松地理解您的代码。

于 2013-10-18T19:59:47.427 回答