介绍java编码。不明白我做错了什么

时间:2013-11-03 22:47:28

标签: java

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

我得到两个错误,我没有第三和第四种方法的返回语句。另外,当我在不修复错误的情况下运行它时,从第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;
}


}

6 个答案:

答案 0 :(得分:5)

  

我得到两个错误,我没有第三和第四种方法的返回语句。

右。让我们来看看第三个:

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?那么该方法的返回值应该是多少?这就是你得到错误的原因,你需要一个最后的else(没有if)来说明当没有一个早期的分支返回一个值时该返回值应该是什么。没有它,该方法会导致编译时错误。

  

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

无法运行它而不修复错误,因为这些是编译时错误。如果您尝试使用这些错误编译此源代码,它将失败,并且您没有获得更新的类文件。因此,如果您尝试运行,并且它似乎正常工作,那么您运行的是您之前编译的类文件的早期副本。该类文件与当前源代码无关,因此可以理解它对您没有意义。您没有看到JVM正在运行的内容。

如果你更正方法以便编译事物(通过添加最终的else并且没有if),那么运行编译结果,事情应该更有意义。同时,您可能希望删除以前的Chapter5ProjectPart2.class文件,因为它已过期。

答案 1 :(得分: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 "";

答案 2 :(得分:0)

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

答案 3 :(得分: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语句。

答案 4 :(得分: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");
    }
}

答案 5 :(得分:0)

Java方法必须返回一个值,除非它将void表示为return。

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

numToChoice方法中,如果num不是1,2或3,则Java不会返回任何值。这不允许用Java编译。

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