簡體   English   中英

切換按鈕鼠標偵聽器空指針異常

[英]toggle button mouse listener null pointer exception

我正在java中創建一個Minesweeper版本,但是在設置toggleButtons的鼠標監聽器時遇到了問題。 我需要在左右鍵單擊中執行不同的操作,所以這是我在MyPanel類中設置的內容:

import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;

    public class MyPanel extends JPanel {

        JToggleButton jButtons[] = new JToggleButton[100];
        int i = 0;

        MyFrame frame;
        JLabel testOut;
        gameEngine engine;

        public MyPanel(MyFrame mf) {
            for (i = 0; i< 100; i++) {
                jButtons[i] = new JToggleButton("");
                jButtons[i].addMouseListener(new MouseAdapter() {
                    public void mouseReleased(MouseEvent e) {
                        if(SwingUtilities.isLeftMouseButton(e)) { //**Exception here**
                            engine.markCell(i);
                            System.out.println("L-click");
                        } else if(SwingUtilities.isRightMouseButton(e)) { //**or here**
                            engine.showCell(i);
                            System.out.println("R-click");
                        }
                    }
                });
            //System.out.print(i);
            add(jButtons[i]);
            }
        }

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
        }
    }

但是,我在其中一條標記的行上得到'nullPointerException'(取決於L或R-click):

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
      at MyPanel$1.museReleased(MyPanel.java:31)
      at java.AWTEventMulticaster.mouseReleased(Unknown Source)

這看起來像'MouseEvent'拋出異常,但我不明白為什么會這樣,更不用說如何解決它。

這是我的其他課程,所以你可以看到'MyFrame'和'gameEngine'所指的內容。

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class MyFrame extends JFrame {

    JToggleButton jButtons[] = new JToggleButton[100];

    gameEngine engine;
    MyPanel panel;

    public MyFrame() {
        setTitle("Minesweeper");
        setSize(500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new MyPanel(this);
        panel.setLayout(new GridLayout(10,10));

        add(panel);
        setVisible(true);
        setResizable(false);
    }

    public gameEngine getGame() {
        return engine;
    }
}

-

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

/** model of minesweeper game: contains mine arrays, as well as methods
for left and right click responses.**/
public class gameEngine {

    private int[][] mines;
    private int Row;
    private int Col;

    //seed based random number generator
    double rnd(){
        int seed = 42;
        Random gen = new Random(seed);
        double output = gen.nextDouble();

        return output;
    }

    /*generate array to represent minefield. generated array will contain only 0s and 1s
    possible cases of array are:
    0: no mine, unmarked
    1: mine, unmarked
    2: no mine: marked
    3: mine: marked */

    //this method generates initial empty array, then calls layMines to populate it
    public void initField(){
        mines = new int[10][10];
        for (int i=0; i<10; i++)
            for(int j=0; j<10; j++)
                mines[i][j] = 0;
        layMines();
    }

    //lays 16 mines into the array using a random number generator
    public void layMines(){
        int minesOnField = 0;
        for (int i=0; i<10; i++) 
            for (int j=0; j<10; j++)
                if (rnd() >=70) { //if roll is successful
                    if (minesOnField < 16){ //and less than 16 mines have been
                        if(mines[i][j] == 0) { //AND it isnt already a mine
                            minesOnField ++;
                            mines[i][j] = 1;
                        }
                    }
                }                
    }

    public void showCell(int x) {
    }

    public void markCell(int x){

    }

    public void test() {
        initField();
        System.out.println(Arrays.deepToString(mines));
    }

}

我的'main'方法只是調用'MyFrame'。

你宣布gameEngine為

gameEngine engine;

雖然你從來沒有初始化它,你使用它像:

if(SwingUtilities.isLeftMouseButton(e)) { //**Exception here**
    engine.markCell(i);
    ...
} else if(SwingUtilities.isRightMouseButton(e)) { //**or here**
    engine.showCell(i);
    ..

默認情況下,如果未初始化對象,則將對象初始化為null,並且對null的任何方法調用都將導致NullPointerException。

你應該初始化引擎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM