我想知道在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)
为什么会出现这个错误?我从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上为我工作。