1

私は持っていHashMap<Integer, JButton>ます。null問題は、JButton ではなく、取得した値を取得しようとするときです。最後の行で centerPanel に「butt」を追加しようとすると、例外が発生します。以下は、私のコードのスニペットであり、コードを全体的に見るための 2 つのクラス フィールドです。

public class GUI {

private JPanel centerPanel;
private JButton button;
private JLabel label;
private Image source;
private Image image;
private HashMap<Integer, JButton> images = new HashMap<>();

public GUI() {

    centerPanel = new JPanel();

    ImageIcon sid = new ImageIcon(GUI.class.getResource("koala.jpg"));
    source = sid.getImage();


    int ind = 0;

    for ( int i = 0; i < 4; i++) {
        for ( int j = 0; j < 3; j++) {

            if ( j == 2 && i == 3) {
                label = new JLabel("");
                centerPanel.add(label);
            } else {
                button = new JButton();
                button.addActionListener(this);
                images.put(new Integer(++ind), button);
                image = createImage(new FilteredImageSource(source.getSource(),
                    new CropImageFilter(j*width/3, i*height/4, 
                        (width/3)+1, height/4)));
                button.setIcon(new ImageIcon(image));
            }
        }
    }

    Random random = new Random();

    for (int i=0; i<11; i++) {
        Integer numb = new Integer(random.nextInt(images.size()));
        JButton butt = images.get(1);
        centerPanel.add(butt);
        images.remove(numb);
    }

    setSize(1024, 768);
    setTitle("Puzzle");
    setResizable(false);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setVisible(true);
}

public static void main(String[] args) {
    new GUI();
}  
}

NullPointerException が発生するのはなぜですか? 整数を明示的に作成する必要がないことは承知しています。

4

2 に答える 2

1
Integer numb = new Integer(random.nextInt(images.size()));
JButton butt = images.get(1);
centerPanel.add(butt);
images.remove(numb);

1回の繰り返しnumbで1に等しくなります(これは、0からimages.size()の間の乱数を取得するため、任意の繰り返しで発生する可能性があり、images.size()11から1に減少するため、これが発生することが保証されています)、インデックスの下の要素1が削除されます。次の反復で をimages.get(1)返しますnull。次にcenterPanel.add(butt);、NPE を取得しようとします。

于 2013-11-02T22:42:26.977 に答える