Matlab报告"线程中的异常"AWT-EventQueue-0"java.lang.NullPointerException"

pat*_*rik 5 java matlab nullpointerexception

您想知道在matlab中重复出现的java错误.它通常发生在matlab使用java做一些繁重的事情时.例如,这可以是按住ctrl + z或ctrl + y.

在复制之前我错误地删除了错误消息,但我认为我可以通过任何方式传递问题的核心.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
...
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会出现这种错误?我从matlab r2007中找到了一些关于这个的信息,这是因为java swing是线程不安全的,并且matlab缺乏支持来确保线程安全.但是,这应该在matlab r2008b中修复.那我为什么现在就拿到它呢?

编辑 这是完整的堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at org.netbeans.editor.BaseDocument.notifyUnmodify(BaseDocument.java:1465)
at org.netbeans.editor.BaseDocument.notifyModifyCheckEnd(BaseDocument.java:816)
at org.netbeans.editor.BaseDocumentEvent.redo(BaseDocumentEvent.java:336)
at javax.swing.undo.UndoManager.redoTo(Unknown Source)
at javax.swing.undo.UndoManager.redo(Unknown Source)
at com.mathworks.mwswing.undo.MUndoManager.redo(MUndoManager.java:255)
at org.netbeans.editor.ActionFactory$RedoAction.actionPerformed(ActionFactory.java:767)
at org.netbeans.editor.BaseAction.actionPerformed(BaseAction.java:259)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at com.mathworks.widgets.SyntaxTextPaneBase.processKeyEvent(SyntaxTextPaneBase.java:1187)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

dic*_*c19 2

好吧,根据您的堆栈跟踪,您的问题可能没有任何明确的答案,正如您已经在 MATLAB 论坛中看到的那样,但鉴于这一行,我认为有一个可能的解释:

\n
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException\n    ...\n    at javax.swing.undo.UndoManager.redoTo(Unknown Source) // <-- here!\n    at javax.swing.undo.UndoManager.redo(Unknown Source)\n    at com.mathworks.mwswing.undo.MUndoManager.redo(MUndoManager.java:255)\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n

UndoManager类保留UndoableEdit对象的内部集合。该集合实际上继承自其超类:CompoundEdit

\n

UndoManager#redo()UndoManager#redoTo(UndoableEdit edit)的内部实现如下所示:

\n
public class UndoManager extends CompoundEdit implements UndoableEditListener {\n    ...\n    public synchronized void redo() throws CannotRedoException {\n        if (inProgress) {\n            UndoableEdit edit = editToBeRedone();\n            if (edit == null) {\n                throw new CannotRedoException();\n            }\n            redoTo(edit);\n        } else {\n            super.redo();\n        }\n    }\n    ...\n    protected void redoTo(UndoableEdit edit) throws CannotRedoException {\n        boolean done = false;\n        while (!done) {\n            UndoableEdit next = edits.elementAt(indexOfNextAdd++);\n            next.redo(); // NPE here?\n            done = next == edit;\n        }\n    }\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

考虑到这种实现,并考虑到 Swing 的事件调度线程 (EDT)很容易引起问题,我认为这可能是 MATLAB 线程和 EDT 之间的线程问题。具体来说,这个 MATLAB 调用的方法可能是问题的根源:

\n
at com.mathworks.mwswing.undo.MUndoManager.redo(MUndoManager.java:255)\n
Run Code Online (Sandbox Code Playgroud)\n

既然您说 MATLAB 需要做繁重的工作,那么认为此方法正在尝试重做一些可能不再可用或由于 EDT 同步问题而可能尚不可用的编辑并非没有道理

\n