Java 从差异类调用方法时出现NullPointer异常
爪哇- 你好 我正在写一个扫雷舰程序(第一个大人物),我真的被卡住了。根据我要遵循的规范,程序本身由2个类组成(一个用于逻辑,一个用于GUI)。这两门课我都做了不少,但我也没有完成。然而,我试图测试从一个类到另一个类的调用方法的实现,这就是我遇到的问题。在GUI类中,我试图在用户每次单击一个框时调用Logic类中的方法openCell(intx,inty)。该逻辑类方法将依次检查方块上是否有地雷、0或数字,并从GUI类调用相应的方法。误差中涉及的两种方法如下:Java 从差异类调用方法时出现NullPointer异常,java,nullpointerexception,method-call,Java,Nullpointerexception,Method Call,爪哇- 你好 我正在写一个扫雷舰程序(第一个大人物),我真的被卡住了。根据我要遵循的规范,程序本身由2个类组成(一个用于逻辑,一个用于GUI)。这两门课我都做了不少,但我也没有完成。然而,我试图测试从一个类到另一个类的调用方法的实现,这就是我遇到的问题。在GUI类中,我试图在用户每次单击一个框时调用Logic类中的方法openCell(intx,inty)。该逻辑类方法将依次检查方块上是否有地雷、0或数字,并从GUI类调用相应的方法。误差中涉及的两种方法如下: GUI CLASS public
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;
}}
最后,如果需要的话,到目前为止,两个类的完整代码(目前还不完整)。(逻辑类中的方法需要按照项目说明执行特定操作,并且在逻辑类中必须没有用户交互)。我搞不清楚到底是什么导致了这个错误。任何指导都将不胜感激。(希望这不是什么很明显的事情,因为即使我得了流感,我还是花了几个小时试图弄明白这一点!哈哈)
import java.awt.*;
导入java.awt.event.*;
导入java.awt.geom.*;
导入javax.swing.*;
导入javax.swing.event.*;
公共类扫雷器UI扩展JFrame实现ActionListener、MouseListener{
整数宽度=10;
整数高度=10;
JPanel p=新的JPanel();
JButton[][]table=新JButton[宽度][高度];
公共扫雷艇(){
扫雷逻辑类=新扫雷逻辑();
logicClass.StartNewName(宽度、高度);
JButton[]按钮=新JButton[宽度*高度];
GridLayout=新的GridLayout(宽度、高度);
p、 设置布局(布局);
对于(int x=0;x logicClass.isOpen(x,y);//知道逻辑类中的117行号会很有帮助。我的猜测可能是我的
,我的[x]
,标记的
或标记的[x]
为空
也就是说,你“在整个表中循环查看哪个被点击”的技巧并没有给我特别的启发
编辑:实际上,问题是isOpen
数组为空,因为您刚刚实例化了该类
EDIT2:好的,这是我最初列出的一个。我的猜测是所有的,因为您刚刚实例化了这个类,它使用的是默认的不做任何事情构造函数。知道逻辑类中的117行是什么会很有帮助。我的猜测可能是我的,我的[x]
,标记的
或标记的[x]
为空
也就是说,你“在整个表中循环查看哪个被点击”的技巧并没有给我特别的启发
编辑:实际上,问题是isOpen
数组为空,因为您刚刚实例化了该类
EDIT2:好的,这是我最初列出的一个。我猜是所有的,因为您刚刚实例化了这个类,它使用的是默认的不做任何事情构造函数。怎么样:
查看异常stacktrace的第一行,查看出现问题的类和行
转到该行,查看在此位置哪些对象可能为“null”
找出空对象没有关联值的原因
如果有多个对象可以为null,您可以System.out.println()
查看它们是什么
那么:
查看异常stacktrace的第一行,查看出现问题的类和行
转到该行,查看在此位置哪些对象可能为“null”
找出空对象没有关联值的原因
如果有多个对象可以为null,您可以System.out.println()
查看它们是什么
数组(flag,isZero,isClicked)未初始化,当您尝试使用它们时为空。您需要GUI类包含逻辑类的实例,并始终使用同一实例。否则,每个GUI操作将在不同的游戏上进行!数组(flag,isZero,isClicked)未初始化且在尝试使用时为空。您需要GUI类包含逻辑类的实例并始终使用该实例。否则,每个GUI操作将在不同的游戏上进行!stacktrace告诉您:
线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常
在MinesweeperLogic.isOpen(MinesweeperLogic.java:117)
因此,您可以转到第117行,并确定哪些引用可能为空。(看起来您在stacktrace被获取后在117处添加了一行,然后注释掉了新行,因此我将在这里指出stacktrace实际上是指现在称为第118行的内容:isClicked[x][y]=true;
)在本例中,唯一可以为null的是isClicked[][]
挖一点
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;
}
}
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MinesweeperLogic.isOpen(MinesweeperLogic.java:117)
at MineSweeperGUI.mouseClicked(MineSweeperGUI.java:126)