gpt4 book ai didi

java - 从不同的类调用方法时出现空指针异常

转载 作者:行者123 更新时间:2023-11-29 09:36:12 24 4
gpt4 key购买 nike

Java-你好,我正在编写一个扫雷程序(第一个大人物)并且真的被卡住了。根据我要遵循的规范,程序本身由 2 个类(一个用于逻辑,一个用于 GUI)组成。我在这两门课上都做了一些,但也没有完成。但是,我正在尝试测试从一个类到另一个类的调用方法的实现,这就是我遇到困难的地方。在 GUI 类中,每次用户单击一个框时,我都试图在逻辑类中调用方法 openCell(int x, int y)。该逻辑类方法将依次检查方 block 上是否有地雷、0 或数字,并从 GUI 类调用适当的方法。报错涉及的两个方法如下:

GUI CLASS
public void mouseClicked(MouseEvent e) {
for (int x = 0 ; x < width ; x++) {
for (int y = 0 ; y < height ; y++) {
if (e.getSource() == table[x][y]) {
if(e.getButton() == e.BUTTON1) {
MinesweeperLogic logicClass = new MinesweeperLogic();
logicClass.isOpen(x, y); // <--------------------------- ERROR
}}}}}

LOGIC CLASS
boolean openCell(int x, int y) {
isClicked[x][y] = true;
if(mine[x][y] == true && flag[x][y]==false) {
return false;
} else if(neighborBombs(x, y) > 0 && flag[x][y]==false) {
return true;
}else {
marked = true;
return marked;
}}

以下是我在用户点击游戏中的某个框时收到的错误报告(它在编译代码时会捕获它):

 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MinesweeperLogic.isOpen(MinesweeperLogic.java:117)
at MineSweeperGUI.mouseClicked(MineSweeperGUI.java:126)
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
at java.awt.Component.processMouseEvent(Component.java:6266)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2475)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

最后,如果需要的话,两个类的完整(目前还不完整)代码。 (逻辑类中的方法需要根据项目的指令执行特定的操作,并且逻辑类中必须没有用户交互)。我无法弄清楚到底是什么导致了错误。任何指导将不胜感激。 (希望这不是很明显的事情,因为我花了最后几个小时试图解决这个问题,即使我得了流感!大声笑)。

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

public class MineSweeperGUI extends JFrame implements ActionListener, MouseListener {
int width = 10;
int height = 10;
JPanel p = new JPanel();
JButton[][] table = new JButton[width][height];

public void MineSweeper() {
MinesweeperLogic logicClass = new MinesweeperLogic();
logicClass.startNewGame(width, height);
JButton[] button = new JButton[width*height];
GridLayout layout = new GridLayout (width, height) ;
p.setLayout(layout);
for(int x = 0 ; x < width ; x++) {
for(int y = 0 ; y < height ; y++) {
table[x][y] = new JButton();
table[x][y].setPreferredSize(new Dimension(25,25));
table[x][y].addMouseListener (this);
p.add(table [x] [y]);
}
}
this.add(p);
this.pack();
this.setVisible(true);
}


public void mouseClicked(MouseEvent e) {
for (int x = 0 ; x < width ; x++) {
for (int y = 0 ; y < height ; y++) {
if (e.getSource() == table[x][y]) {
if(e.getButton() == e.BUTTON1) {
MinesweeperLogic logicClass = new MinesweeperLogic();
logicClass.isOpen(x, y); //<--------------------------------------
}
}
}
}
}
public void gameover(int x, int y) {
table[x][y].setText("*");
}

public static void main(String[]args) {
MineSweeperGUI guiClass = new MineSweeperGUI();
guiClass.MineSweeper();
}}


public void actionPerformed(ActionEvent e) {
}

public void mouseEntered(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {
}

public void mouseExited(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}




public class MinesweeperLogic {

private int w, h, maxBombs, bombsremaining;
public int width, height;
private boolean mine[][];
private boolean flag[][];
private boolean isClicked[][];
private boolean isZero[][];
private boolean marked;



public void startNewGame(int width, int height) {
w = width;
h = height;
flag = new boolean[w][h];
isZero = new boolean[w][h];
isClicked = new boolean[w][h];
mine = new boolean[w][h];
maxBombs =(int) Math.floor (width*height*0.15);
bombsremaining = maxBombs;
for(int i = 0; i < maxBombs; i++) {
int x = (int) (Math.random() * (w));
int y = (int) (Math.random() * (h));
if (mine[x][y] == false) {
mine[x][y] = true;
isClicked[x][y] = false;
flag[x][y] = false;
}
}
}


int getWidth() {
return w;
}


int getHeight() {
return h;
}


boolean openCell(int x, int y) { // <---------------------------------------------
//MineSweeperGUI guiClass = new MineSweeperGUI();
isClicked[x][y] = true;
if(mine[x][y] == true && flag[x][y]==false) {
//guiClass.gameover(x, y);
return false;
} else if(neighborBombs(x, y) > 0 && flag[x][y]==false) {
return true;
} else {
marked = true;
return marked;
}}


boolean markCell(int x, int y) {
if(flag[x][y] == true) {
flag[x][y] = false;
isClicked[x][y] = false;
bombsremaining++;
marked = false;
return marked;
} else {
flag[x][y] = true;
isClicked[x][y] = true;
bombsremaining--;
if(mine[x][y]==true) {
return true;
} else {
return false;
}
}
}


boolean isOpen(int x, int y) {
if(isClicked[x][y] == false) {
return false;
} else {
return true;
}
}


boolean isMarked(int x, int y) {
if(flag[x][y] == true) {
return true;
} else {
return false;
}
}


int getValue(int x, int y) {
if(mine[x][y] == true) {
return -1;
} else {
return neighborBombs(x, y);
}
}


private int neighborBombs(int x, int y) { // checks surrounding 8 squares for number of bombs
int surBombs = 0;
for (int q = x - 1 ; q <= x + 1 ; q++) {
for (int w = y - 1 ; w <= y + 1 ; w++) {
while (true) {
if (q < 0 || w < 0 || q >= w || w >= h) {
break;
}
if (mine[q][w] == true) {
surBombs++;
break;
}
}
}
}
return surBombs;
}
}

最佳答案

怎么样:

  1. 查看异常堆栈跟踪的第一行,看看问题发生在哪个类和哪一行
  2. 转到该行,查看哪些对象可能在此位置为“空”
  3. 找出为什么 null 对象没有赋值
  4. 如果有多个对象可能为空,您可以System.out.println() 它们,看看是哪一个。

关于java - 从不同的类调用方法时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com