Hangman GUI接收空指针异常而找不到位置

时间:2012-04-14 04:40:50

标签: java swing user-interface nullpointerexception

我目前正在使用Hangman GUI作为硬件任务,我已经完成了所有代码(我认为)但是,我得到了一个nullpointerexception并且无法弄清楚它的起源是什么,它让我相当愤怒。我需要第二眼来帮助我弄清楚我犯了什么错误以及我需要做些什么来纠正它。提前谢谢!

NPE出现在:

alphabet = "abcdefghijklmnopqrxtuvwxyz";
            numLetters = 26;
            for (int count = 0; count < numLetters; count++) {
                letterChoice[count] = new JButton(Character.toString(alphabet
                        .charAt(count)));
                letterChoice[count].addActionListener(new CharacterListener(
                        alphabet.charAt(count)));
                letterChoice[count].setMnemonic(65 + count);
                add(letterChoice[count]);
            }

这是我的所有代码。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ImageIcon;
import javax.swing.SwingConstants;

public class HangmanPanel extends JPanel {
    private JLabel imageLabel, numberLetters, gameOver, youWin;
    private JLabel[] spaces;
    private ImageIcon[] images;
    private JButton exitProgram, newGame, nextImage;
    private JButton[] letterChoice;
    private int imageNumber, letterNumber, numLetters, guesses;
    private WordList wordRand;
    private String word, alphabet;

    public HangmanPanel() {

        newGame = new JButton("New Game");
        newGame.setEnabled(true);
        newGame.setToolTipText("Press to restart game.");
        newGame.addActionListener(new NewGame());

        exitProgram = new JButton("Exit");
        exitProgram.setEnabled(true);
        exitProgram.setToolTipText("Press to close the program.");
        exitProgram.addActionListener(new ExitGame());

        wordRand = new WordList();
        word = wordRand.getWord();

        images = new ImageIcon[8];
        // Populating the array
        {
            images[0] = new ImageIcon("hangman0.png");
            images[1] = new ImageIcon("hangman1.png");
            images[2] = new ImageIcon("hangman2.png");
            images[3] = new ImageIcon("hangman3.png");
            images[4] = new ImageIcon("hangman4.png");
            images[5] = new ImageIcon("hangman5.png");
            images[6] = new ImageIcon("hangman6.png");
            images[7] = new ImageIcon("hangman7.png");
        }

        setBackground(Color.white);
        imageLabel = new JLabel(images[imageNumber]);
        imageNumber++;
        add(imageLabel);

        alphabet = "abcdefghijklmnopqrxtuvwxyz";
        numLetters = 26;
        for (int count = 0; count < numLetters; count++) {
            letterChoice[count] = new JButton(Character.toString(alphabet
                    .charAt(count)));
            letterChoice[count].addActionListener(new CharacterListener(
                    alphabet.charAt(count)));
            letterChoice[count].setMnemonic(65 + count);
            add(letterChoice[count]);
        }

        spaces = new JLabel[word.length()];
        while (letterNumber < spaces.length) {
            numberLetters = new JLabel("___");
            add(numberLetters);
            letterNumber++;
        }

        add(nextImage);
        add(newGame);
        add(exitProgram);

    }

    private class NewGame implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            imageLabel.setIcon(images[0]);
            imageNumber = 0;
            imageNumber++;
            imageLabel.repaint();
        }
    }

    private class ExitGame implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }

    private class CharacterListener implements ActionListener {
        public CharacterListener(char charAt) {

        }

        public void actionPerformed(ActionEvent e) {
            while (guesses < images.length) {
                int count = 0;
                while (count < word.charAt(count)) {
                    if (letterChoice[count].equals(word.charAt(count))) {
                        spaces[count] = new JLabel("" + letterChoice[count]
                                + "");
                        count++;
                    } else
                        imageLabel.setIcon(images[imageNumber]);
                    imageNumber++;
                    imageLabel.repaint();
                    guesses++;

                }

                if (guesses == 7) {
                    gameOver = new JLabel(
                            "You lose! Press New Game to try again!");
                    add(gameOver);
                } else
                    youWin = new JLabel(
                            "You win! Press New Game to play again or press Exit to remain Victorious!");
                add(youWin);
            }

        }

    }

}

1 个答案:

答案 0 :(得分:3)

NullPointerException应该告诉你导致问题的是哪一行。你能否发布例外情况,我们会尽力帮你找出它在特定行发生的原因。

如果没有这些信息,可能会出现一些错误。

第一个可能的错误...... 你没有创建letterChoice数组 - 也就是说你在字母表之前的某个地方错过了以下内容......

letterChoice = new JButton[26];

第二个可能的错误...... 你没有创建nextImage - 即你错过了以下内容......

newImage = new JButton("Blah");

第3个可能的错误......

    public void actionPerformed(ActionEvent e) {
        while (guesses < images.length) {
            int count = 0;
            while (count < word.charAt(count)) { // probably here
                if (letterChoice[count].equals(word.charAt(count))) { // maybe here too
                    spaces[count] = new JLabel("" + letterChoice[count]
                            + "");
                    count++;
                } else
                    imageLabel.setIcon(images[imageNumber]);
                imageNumber++;
                imageLabel.repaint();
                guesses++;

            }

原因是:如果您正在执行word.charAt(count)之类的命令,则应确保计数小于第一个单词的长度。将行更改为...

while (count < word.length && count < word.charAt(count)) {

第4个可能的错误...... 你的字母列表中没有's',而是有2个'字符。