需要帮助调试,代码编译但不会运行

时间:2014-03-07 22:58:40

标签: java debugging user-interface nullpointerexception

嘿,我可以使用帮助来调试这个程序。代码不是我的,它是从一个问题的答案,我想尝试它,但我得到一个NullPointerException,无法找出问题所在。我认为问题可能是图像路径,但我不确定所以我可以使用帮助。

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;

public class CircleImages {

private int score = 0;
private JTextField scoreField = new JTextField(10);

public CircleImages() {
    scoreField.setEditable(false);

    final ImageIcon[] icons = createImageIcons();
    final JPanel iconPanel = createPanel(icons, 8);

    JPanel bottomLeftPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
    bottomLeftPanel.add(new JLabel("Score: "));
    bottomLeftPanel.add(scoreField);

    JPanel bottomRightPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING));
    JButton newGame = new JButton("New Game");
    bottomRightPanel.add(newGame);
    JButton quit = new JButton("Quit");
    bottomRightPanel.add(quit);

    JPanel bottomPanel = new JPanel(new GridLayout(1, 2));
    bottomPanel.add(bottomLeftPanel);
    bottomPanel.add(bottomRightPanel);

    newGame.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            reset(iconPanel, icons);
            score = 0;
            scoreField.setText(String.valueOf(score));
        }
    });

    JFrame frame = new JFrame();
    frame.add(iconPanel);
    frame.add(bottomPanel, BorderLayout.PAGE_END);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

private void reset(JPanel panel, ImageIcon[] icons) {
    Component[] comps = panel.getComponents();
    Random random = new Random();
    for(Component c : comps) {
        if (c instanceof JLabel) {
            JLabel button = (JLabel)c;
            int index = random.nextInt(icons.length);
            button.setIcon(icons[index]);
        }
    }
}

private JPanel createPanel(ImageIcon[] icons, int gridSize) {
    Random random = new Random();
    JPanel panel = new JPanel(new GridLayout(gridSize, gridSize));
    for (int i = 0; i < gridSize * gridSize; i++) {
        int index = random.nextInt(icons.length);
        JLabel label = new JLabel(icons[index]);
        label.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e) {
                score += 1;
                scoreField.setText(String.valueOf(score));
            }
        });
        label.setBorder(new LineBorder(Color.GRAY, 2));
        panel.add(label);
    }
    return panel;
}

private ImageIcon[] createImageIcons() {
    String[] files = {"DarkGrayButton.png",
        "BlueButton.png",
        "GreenButton.png",
        "LightGrayButton.png",
        "OrangeButton.png",
        "RedButton.png",
        "YellowButton.png"
    };
    ImageIcon[] icons = new ImageIcon[files.length];
    for (int i = 0; i < files.length; i++) {
        icons[i] = new ImageIcon(getClass().getResource("/circleimages/" + files[i]));
    }
    return icons;
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new CircleImages();
        }
    });
}

}

1 个答案:

答案 0 :(得分:0)

你的问题在这里:

icons[i] = new ImageIcon(getClass().getResource("/circleimages/" + files[i]));

您的项目中没有所需的图片,因此getClass().getResource()会返回nullNullPointerException的构造函数中会有ImageIcon

您需要做的是将以下文件放在项目中:

  • /circleimages/DarkGrayButton.png
  • /circleimages/BlueButton.png
  • /circleimages/GreenButton.png
  • /circleimages/LightGrayButton.png
  • /circleimages/OrangeButton.png
  • /circleimages/RedButton.png
  • /circleimages/YellowButton.png