“线程中的异常”;AWT-EventQueue-0“;java.lang.NullPointerException(国际象棋编程)

“线程中的异常”;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

有人能帮我弄清楚为什么会发生这种事吗???当我点击电路板上的一个按钮时,会发生异常。电路板上的每个正方形都涂有JButton

我得到了一个指向以下代码行的
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
is
null
还是
boardState[start.getRow()][start.getCol()][start.getRow()][start.getCol()][start.getCol()][/code>is
null
,谢谢您的回复。你说得对。当我调试它时,我发现[start.getRow()][start.getCol()]为空。为什么会这样?再次调试,看看为什么它没有初始化…我想你不明白“runnable”示例的含义,就像我检查“wiki.eclipse.org/JDT\u Core/Null\u Analysis”时所说的那样。我觉得它过时了。当我尝试在eclipse上安装插件时,安装链接似乎断开了。稍后我将进一步研究空分析。谢谢你,埃里克