0

我真的不确定我的代码有什么问题。它应该通过接受用户的选择,将其与随机的计算机选择进行比较并显示结果来对计算机进行剪刀石头布。

我收到两个错误,我没有第 3 和第 4 方法的返回语句。此外,当我在不修复错误的情况下运行它时,从第 60 行开始的嵌套 if 语句只打印出两个 println 语句之一,这对我来说真的是零意义。

import java.util.Random;
import java.util.Scanner;
public class Chapter5ProjectPart2 {

    public static void main(String[] args) {

    Random generator = new Random();
    Scanner keyboard = new Scanner(System.in);

    int userNum;
    int compNum;
    String userChoice = "";
    String compChoice = "";
    int rnum;
    int result = 0;
    boolean keepPlaying;
    int input = 1;


    do
    {   
        compNum = generator.nextInt(2)+1;
        compChoice = numToChoice(compNum);

        menu();

        userNum = keyboard.nextInt();
        userChoice = numToChoice(userNum);
        keyboard.nextInt();

        System.out.println();
        System.out.println("you chose " + userChoice);
        System.out.println("the computer chose " + compChoice);

        result = resultCheck(userNum, compNum);


        if (result == 1) // user wins
        {
            if (userNum == 1) //user won choosing rock
            {
                System.out.println("rock beats scissors");
                System.out.println("you win");
            }
            else if (userNum == 2) //user won choosing paper
            {
                System.out.println("paper beats rock");
                System.out.println("you win");
            }
            else if (userNum == 3)  //user won choosing scissors
            {
                System.out.println("scissors beats paper");
                System.out.println("you win");
            }
        }
        else if (result == 3) //user loses
        {
            if (userNum == 1)  //user lost choosing rock
            {
                System.out.println("paper beats rock");
                System.out.println("you lose");
            }
            else if (userNum == 2)  //user lost choosing paper
            {
                System.out.println("scissors beats paper");
                System.out.println("you lose");
            }
            else if (userNum == 3)  //user lost choosing scissors
            {
                System.out.println("rock beats scissors");
                System.out.println("you lose");
            }
        else if (result == 2) //draw
            System.out.println("draw");
        }

        System.out.println("would you like to play again?");
        System.out.println("1 = yes");
        System.out.println("2 = no");
        input = keyboard.nextInt();
        keepPlaying = play(input);

    } while (keepPlaying == true);

}


// method 1 (menu)
public static void menu()
{
System.out.println("Enter your choice of rock, paper, or scissors\n" + "1 = rock\n" + "2 = paper\n" + "3 = scissors");
}

// method 2 (result check)
public static int resultCheck(int userNum, int compNum)
{
    if (userNum == 2 && compNum == 1)
        return 1;
    else if (userNum == 1 && compNum == 3)
        return 1;
    else if (userNum == 3 && compNum == 2)
        return 1;
    else if (userNum == compNum)
        return 2;
    else
        return 3;
}

// method 3 (converting number choice to rock/paper/scissors
public static String numToChoice(int num)
{
    if (num == 1)
        return "rock";
    else if (num == 2)
        return "paper";
    else if (num == 3)
        return "scissors";
}

//method 4 (play again)
public static boolean play(int input)
{
    if (input == 1)
        return true;
    else if (input == 2)
        return false;
}


}
4

6 回答 6

5

我收到两个错误,我没有第 3 和第 4 方法的返回语句。

正确的。我们来看第三个:

public static String numToChoice(int num)
{
    if (num == 1)
        return "rock";
    else if (num == 2)
        return "paper";
    else if (num == 3)
        return "scissors";
}

假设num不是 1、23?那么方法的返回值应该是什么呢?这就是您收到错误的原因,您需要一个 final else(没有if)说明当早期分支都没有返回值时该返回值应该是什么。没有它,该方法会导致编译时错误。

此外,当我在不修复错误的情况下运行它时,从第 60 行开始的嵌套 if 语句只打印出两个 println 语句之一,这对我来说真的是零意义。

不能在不修复错误的情况下运行它,因为这些是编译时错误。如果您尝试在存在这些错误的情况下编译此源代码,则会失败,并且您不会获得更新的类文件。因此,如果您随后尝试运行,并且它似乎可以工作,那么您正在运行您在这些错误出现之前编译的类文件的早期副本。该类文件与当前的源代码无关,因此对您来说毫无意义是可以理解的。您没有查看 JVM 正在运行什么。

如果您更正方法以便编译(通过添加else带有 no的 final if),然后运行编译结果,事情应该更有意义。同时,您可能想要删除以前的Chapter5ProjectPart2.class文件,因为它已经过时了。

于 2013-11-03T22:52:33.823 回答
0

首先,永远不要运行不能编译的代码。

第二:检查这个方法:

public static boolean play(int input)
{
    if (input == 1)
        return true;
    else if (input == 2)
        return false;
}

如果输入为 6、-67 或 789,该方法将返回什么?你没有说出来,编译器也猜不到。所以它拒绝编译,直到你告诉它在这些情况下要返回什么。

如果其他情况永远不会发生,则抛出异常:

public static boolean play(int input)
{
    if (input == 1)
        return true;
    else if (input == 2)
        return false;
    else {
        throw new IllegalStateException("input is " + input + ". Something's really wrong");
    }
}
于 2013-11-03T22:54:52.107 回答
0

Java 方法必须返回一个值,除非它声明void为返回。

在您的play方法中,如果input不是 1 或 2,Java 将不会返回任何值。这不允许在 Java 中编译。

在您的numToChoice方法中,如果num不是 1、2 或 3,Java 将不会返回任何值。这不允许在 Java 中编译。

添加else关闭以在“意外”情况下返回值,并允许 Java 编译。

于 2013-11-03T22:56:32.427 回答
0
public static String numToChoice(int num)
{
    if (num == 1)
        return "rock";
    else if (num == 2)
        return "paper";
    else if (num == 3)
        return "scissors";
}

//method 4 (play again)
public static boolean play(int input)
{
    if (input == 1)
        return true;
    else if (input == 2)
        return false;
}

这些方法应该总是返回一些东西。例如方法 3,如果 int num 为 4,它不会返回任何内容。通过添加解决它:

else return "";
于 2013-11-03T22:52:30.710 回答
0

那是因为您没有在方法 3 和 4 中以else子句结束else-if语句。

于 2013-11-03T22:52:41.233 回答
0

你确实缺乏return陈述。Java 期望非 void 方法总是返回一个值或抛出一个异常。有一个非 void 方法结束而不返回或抛出异常是一个错误。

public static String numToChoice(int num)
{
    if (num == 1)
        return "rock";
    else if (num == 2)
        return "paper";
    else if (num == 3)
        return "scissors";
}

num在这里,如果不是 1、2 或 3 ,您的方法不会返回任何内容。同样:

public static boolean play(int input)
{
    if (input == 1)
        return true;
    else if (input == 2)
        return false;
}

这里不是 1 或 2 的输入缺少它们的return语句。

于 2013-11-03T22:52:44.513 回答