-1

我目前正在将 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);
            }

        }

    }

}
4

1 回答 1

3

NullPointerException 应该告诉您是哪一行导致了问题。您能否发布异常,我们将尝试帮助您找出为什么它会发生在特定行。

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

第一个可能的错误... 您没有创建 letterChoice 数组-即您在字母表之前的某处缺少以下内容...

letterChoice = new JButton[26];

第二个可能的错误... 您没有创建nextImage-即您缺少以下内容...

newImage = new JButton("Blah");

第三个可能的错误...

    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),则应首先确保 count 小于单词的长度。将行更改为...

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

第 4 个可能的错误... 您的字母列表中没有“s”,而是包含 2 个“s”字符。

于 2012-04-14T04:54:03.950 回答