岩石,纸张,剪刀程序中的空指针异常

时间:2015-10-02 03:00:25

标签: java nullpointerexception compiler-errors

我想通过让大家知道这是我第一次出现堆栈溢出来引导这个问题,所以如果我不符合问题标准,请告诉我。

我正在制作一个与你合作播放Rock,Paper,Scissors的程序,当我接近项目的后端时,出现了这个错误:

Exception in thread "main" java.lang.NullPointerException
  at RockPaperScissors.getPlayerThrow(RockPaperScissors.java:93)
  at RockPaperScissors.main(RockPaperScissors.java:26)

我不知道我会在哪里使用null,但这就是你在这里的目的。

这是目前编译的整个项目:

public class RockPaperScissors {
//sets the constants
static final int ROCK = 1;
static final int PAPER = 2;
static final int SCISSORS = 3;

//creates some variables
static int playerThrow, computerThrow, result, timesPlayed, playerWins, computerWins;
static String playAgain;
static Scanner fru;

/*
 * The Results
 * 0 = tie
 * 1 = Player win
 * 2 = Computer win
*/

public static void main(String[] args) {
    //this do while loop is the whole game
    do {
        //decides the throws of the players
        playerThrow = getPlayerThrow();
        computerThrow = (int)(Math.random() * 3 + 1);

        switch(playerThrow) {
        //compares and displays the computer and player
        //choices if the player chooses rock
        case ROCK:
            switch(computerThrow) {
            case ROCK:
                result = 0;
                System.out.println("You threw rock and the computer threw rock!");
                break;
            case PAPER:
                result = 2;
                System.out.println("You threw rock and the computer threw paper!");
                break;
            case SCISSORS:
                result = 1;
                System.out.println("You threw rock and the computer threw scissors!");
                break;
            }   break;
        //compares and displays the computer and player
        //choices if the player throws paper
        case PAPER:
            switch(computerThrow) {
            case ROCK:
                result = 1;
                System.out.println("You threw paper and the computer threw rock!");
                break;
            case PAPER:
                result = 2;
                System.out.println("You threw paper and the computer threw paper!");
                break;
            case SCISSORS:
                result = 3;
                System.out.println("You threw paper and the computer threw scissors!");
                break;
            }   break;
        //compares and displays the computer and player
        //choices if the player throws scissors
        case SCISSORS:
            switch(computerThrow) {
            case ROCK:
                result = 2;
                System.out.println("You threw scissors and the computer threw rock!");
                break;
            case PAPER:
                result = 1;
                System.out.println("You threw scissors and the computer threw paper!");
                break;
            case SCISSORS:
                result = 0;
                System.out.print("You threw scissors and the computer threw scissors!");
                break;
            }   break;
        }
        timesPlayed ++;

        // will compare and decide the winner of the two players
        finish();

    } while (timesPlayed < 3);
}

public static int getPlayerThrow() {
    //prompts weapon choice and stores said choice
    System.out.println("Choose your weapon of choice:\n(1 for rock, 2 for paper, 3 for scissors)");
    int choice = fru.nextInt();

    //checks for validity and returns the choice
    if (choice != 1 && choice != 2 && choice != 3) {
        System.out.print("Not a valid input!\n Please try again: ");
        choice = fru.nextInt();
    }

    return choice;
}

//compares and decides the winner of the two players
public static void finish() {
    //displays the winner of the round accourding to aforementioned possible results
    switch(result) {
    case 0:
        System.out.println("Its a tie!"); break;
    case 1:
        System.out.println("You are victorious! Man over machine!");
         playerWins++; break;
    case 2:
        System.out.println("The computer has taken the round! Technological singularity approaches!");
        computerWins++; break;
    }

    //cheks if the match is over and displays messages accordingly
    switch(timesPlayed) {
    case 1: break;
    case 2:
        if (playerWins == 2 || computerWins == 2) {
            if (playerWins == 2) {
                System.out.println("You win the match! Congratulations!\nWould you like to play another match?\n(y for yes, n for no)");
                timesPlayed = 5;
                playAgain = fru.nextLine();

                //checks for validity
                if (playAgain != "y" || playAgain != "n") {
                    System.out.print("Not a valid input!\n Please try again: ");
                    playAgain = fru.nextLine();
                }
            }
            else if (computerWins == 2) {
                System.out.println("The computer wins the match!\nPlay again! I know you can beat it.\n(y for yes, n for no)");
                timesPlayed = 5;
                playAgain = fru.nextLine();

                //checks for validity
                if (playAgain != "y" || playAgain != "n") {
                    System.out.print("Not a valid input!\n Please try again: ");
                    playAgain = fru.nextLine();
                }
            }
        } break;
    //will happen for any amount of times played over 2
    default:
        if (playerWins == 2) {
            System.out.println("You win the match! Congratulations!\nWould you like to play another match?\n(y for yes, n for no)");
            playAgain = fru.nextLine();

            //checks for validity
            if (playAgain != "y" || playAgain != "n") {
                System.out.print("Not a valid input!\n Please try again: ");
                playAgain = fru.nextLine();
            }
        }
        else if (computerWins == 2) {
            System.out.println("The computer wins the match!\nPlay again! I know you can beat it.\n(y for yes, n for no)");
            playAgain = fru.nextLine();

            //checks for validity
            if (playAgain != "y" || playAgain != "n") {
                System.out.print("Not a valid input!\n Please try again: ");
                playAgain = fru.nextLine();
            }
        }
    }
}
}

我既不了解错误的含义,也不了解它的来源。关于它的唯一信息来自于浏览谷歌的错误,但是当问题或发布的示例并非特定于我的项目时,这很难。我已经采取了多个步骤来修复它,但它们似乎都没有做任何事情。

这可能是一个复杂的编码问题或我错过的单个字符,但是任何和所有帮助都表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:0)

我看到很多地方你使用 fru扫描仪,但绝对没有你实际初始化它的地方。你有什么基本归结为:

import java.util.Scanner;
public class Test {
    static Scanner fru;
    public static void main(String[] arg) {
        int x = fru.nextInt();
        System.out.println(x+1);
    }
}

并且,当你运行它时,你会看到异常。您需要执行以下操作:

fru = new Scanner(System.in);

在您尝试进行任何扫描之前。在你这样做之前,尝试取消引用它会导致你得到的异常。换句话说,比如:

import java.util.Scanner;
public class Test {
    static Scanner fru;
    public static void main(String[] arg) {
        fru = new Scanner(System.in);
        int x = fru.nextInt();
        System.out.println(x+1);
    }
}

成功运行。

在将来发现这些问题方面,您最好查看实际获得的错误消息:

Exception in thread "main" java.lang.NullPointerException
  at RockPaperScissors.getPlayerThrow(RockPaperScissors.java:93)
  at RockPaperScissors.main(RockPaperScissors.java:26)

尽管您的错误消息完全与您的代码相匹配(行号被三个关闭),但检查堆栈跟踪以追踪错误的位置和错误是一项至关重要的技能。

在这种情况下,它是行:

int choice = fru.nextInt();

因此您认为这是因为fru未正确设置。从那里开始,追溯到实际将fru设置为有用的地方。在这种特殊情况下,这种情况不存在,因此相对容易理解。