“线程中的异常”;AWT-EventQueue-0“;java.lang.NullPointerException(国际象棋编程)
有人能帮我弄清楚为什么会发生这种事吗???当我点击电路板上的一个按钮时,会发生异常。电路板上的每个正方形都涂有JButton 我得到了一个指向以下代码行的“线程中的异常”;AWT-EventQueue-0“;java.lang.NullPointerException(国际象棋编程),java,Java,有人能帮我弄清楚为什么会发生这种事吗???当我点击电路板上的一个按钮时,会发生异常。电路板上的每个正方形都涂有JButton 我得到了一个指向以下代码行的java.lang.NullPointerException: BoardState.moveFrom_To(BoardState.java:84)-BoardState[start.getRow()][start.getCol()].moveTo(end) 移动件(CommandExecutions.java:257)-board.moveF
java.lang.NullPointerException
:
BoardState.moveFrom_To(BoardState.java:84)-BoardState[start.getRow()][start.getCol()].moveTo(end)
移动件(CommandExecutions.java:257)-board.moveFrom_到(selectedPiece,loc)
processOne(CommandExecutions.java:331)-movePiece(loc)
MainFrame.actionPerformed(MainFrame.java:263)-loc=processLocation(新位置(y,x))
以下是异常消息:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.ja264chess.chess.board.BoardState.moveFrom_To(BoardState.java:84)
at com.ja264chess.chess.menus.CommandExecutions.movePiece(CommandExecutions.java:257)
at com.ja264chess.chess.menus.CommandExecutions.processOne(CommandExecutions.java:331)
at com.ja264chess.chess.menus.MainFrame.actionPerformed(MainFrame.java:263)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3312)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
棋子
public abstract void moveTo(Location moveLoc);
国王、王后、骑士等
public void moveTo(Location moveLoc)
{
setLocation(moveLoc);
}
方法
public void processOne(Location loc)
{
if(board.getState()[loc.getRow()][loc.getCol()]!=null)
{
if((board.getState()[loc.getRow()][loc.getCol()].getColor() && isWhiteTurn) || (!board.getState()[loc.getRow()][loc.getCol()].getColor() && !isWhiteTurn))
{
mainframe.enableSide(isWhiteTurn);
selectedPiece = loc;
mainframe.resetBackground();
mainframe.resetBorders();
mainframe.selected(selectedPiece);
System.out.println("selected Piece" +selectedPiece);
processMoves();
}
else
{
movePiece(loc);
board.resetOtherPawns(loc);
checkPromotion(loc);
checkGameOver();
}
}
else
{
movePiece(loc);
board.resetOtherPawns(loc);
checkPromotion(loc);
checkGameOver();
}
}
正如在评论中确定的,问题是传递了一个
null
引用,而预期没有引用。不幸的是,这些问题经常出现。补救这些情况的一种方法是使用来自的工具。指定对象需要支持的契约。在Java中,尤其是在使用Eclipse时,这可以通过自动化来完成
使用此策略,可能传递的
null
引用可能会被提前捕获。此外,通过IDE对可疑代码发出警告和错误,可以提高代码设计的总体质量。这绝对值得一看 感谢埃里克和所有提出我问题的人。最后,我终于把它修好了。字段“selectedPiece”为空,因此我必须创建“setter”和“getter”属性方法来正确初始化它。这为我解决了问题。欢迎来到堆栈溢出!事实上,一个测试需要更少的猜测工作和更好的响应,所以无论是boardState
isnull
还是boardState[start.getRow()][start.getCol()][start.getRow()][start.getCol()][start.getCol()][/code>isnull
,谢谢您的回复。你说得对。当我调试它时,我发现[start.getRow()][start.getCol()]为空。为什么会这样?再次调试,看看为什么它没有初始化…我想你不明白“runnable”示例的含义,就像我检查“wiki.eclipse.org/JDT\u Core/Null\u Analysis”时所说的那样。我觉得它过时了。当我尝试在eclipse上安装插件时,安装链接似乎断开了。稍后我将进一步研究空分析。谢谢你,埃里克