MATLAB 报告 "Exception in thread " AWT-EventQueue-0 " java.lang.NullPointerException"



我想知道在MATLAB中反复发生的Java错误。它通常发生在MATLAB用Java做一些繁重的工作时。例如,按住Ctrl + ZCtrl + Y

我确实在复制之前错误地删除了错误信息,但我认为无论如何我都可以传递问题的核心。

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

为什么会出现这个错误?我从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)

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

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

UndoManager类保留了一个内部的UndoableEdit对象集合。这个集合实际上继承自它的父类:CompoundEdit。

内部实现的UndoManager#redo()和UndoManager#redoTo(UndoableEdit edit)看起来像这样:

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

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

at com.mathworks.mwswing.undo.MUndoManager.redo(MUndoManager.java:255)

既然你说MATLAB需要做繁重的工作,认为这种方法试图重做一些编辑,这可能是不可用的或可能还不可用,由于与EDT的同步问题。

您可以找到包含MATLAB设置等的~/.matlab文件夹。使用ls -la显示所有隐藏的文件和文件夹

打开终端,执行sudo chmod 757 -R ~/.matlab

同样,在Documents中有一个文件夹MATLAB。执行sudo chmod 757 -R ~/Documents/MATLAB .

现在重新启动没有root权限的MATLAB。它在Ubuntu 14.04 (Trusty Tahr)和MATLAB 2015上为我工作。

相关内容

最新更新