我有一个程序里面用到SWT中的StyleText组件。经常会出现以下异常。该异常自SWT内部抛出。不知道问题到底出在哪,怎么解决。
java.lang.IllegalArgumentException: Argument not valid
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.graphics.TextLayout.getLineIndex(Unknown Source)
at org.eclipse.swt.custom.StyledText.getOffsetAtPoint(Unknown Source)
at org.eclipse.swt.custom.StyledText.doPageDown(Unknown Source)
at org.eclipse.swt.custom.StyledText.invokeAction(Unknown Source)
at org.eclipse.swt.custom.StyledText.handleKey(Unknown Source)
at org.eclipse.swt.custom.StyledText.handleKeyDown(Unknown Source)
at org.eclipse.swt.custom.StyledText$7.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Unknown Source)
at org.eclipse.swt.widgets.Control.gtk_key_press_event(Unknown Source)
at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Unknown Source)
at org.eclipse.swt.widgets.Widget.windowProc(Unknown Source)
at org.eclipse.swt.widgets.Control.windowProc(Unknown Source)
at org.eclipse.swt.widgets.Display.windowProc(Unknown Source)
at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(Unknown Source)
at org.eclipse.swt.widgets.Display.eventProc(Unknown Source)
at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at net.heartsome.xlfedit.view.XLFEditMain.show(XLFEditMain.java:4192)
at net.heartsome.xlfedit.view.XLFEditMain.main(XLFEditMain.java:4207)
java.lang.IllegalArgumentException: Argument not valid
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.graphics.TextLayout.getLineIndex(Unknown Source)
at org.eclipse.swt.custom.StyledText.getOffsetAtPoint(Unknown Source)
at org.eclipse.swt.custom.StyledText.doPageDown(Unknown Source)
at org.eclipse.swt.custom.StyledText.invokeAction(Unknown Source)
at org.eclipse.swt.custom.StyledText.handleKey(Unknown Source)
at org.eclipse.swt.custom.StyledText.handleKeyDown(Unknown Source)
at org.eclipse.swt.custom.StyledText$7.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.gtk_key_press_event(Unknown Source)
at org.eclipse.swt.widgets.Control.gtk_key_press_event(Unknown Source)
at org.eclipse.swt.widgets.Composite.gtk_key_press_event(Unknown Source)
at org.eclipse.swt.widgets.Widget.windowProc(Unknown Source)
at org.eclipse.swt.widgets.Control.windowProc(Unknown Source)
at org.eclipse.swt.widgets.Display.windowProc(Unknown Source)
at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(Unknown Source)
at org.eclipse.swt.widgets.Display.eventProc(Unknown Source)
at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at net.heartsome.xlfedit.view.XLFEditMain.show(XLFEditMain.java:4192)
at net.heartsome.xlfedit.view.XLFEditMain.main(XLFEditMain.java:4207)
at net.heartsome.xlfedit.view.XLFEditMain.show(XLFEditMain.java:4192)
at net.heartsome.xlfedit.view.XLFEditMain.main(XLFEditMain.java:4207)
这两行是display分发事件的循环。
贴合上面相关的。
| SWT.WRAP | SWT.BORDER);
GridData sourcedata = new GridData(GridData.FILL_BOTH
| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
sourcedata.heightHint = 40;
source.setLayoutData(sourcedata);
source.addMouseMoveListener(new MouseMoveListener() {
public void mouseMove(MouseEvent e) {
......
}
}); target = new StyledText(targetForm, SWT.MULTI | SWT.WRAP
| SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
GridData targetdata = new GridData(GridData.FILL_BOTH
| GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
targetdata.heightHint = 40;
target.setLayoutData(targetdata);
target.addMouseMoveListener(new MouseMoveListener() {
public void mouseMove(MouseEvent e) {
......
}
});以上是创建时的,有时会调用StyleText的getOffsetAtLocation方法。
问题果然出在getOffsetAtLocation方法,因为该点没有指定的字符抛出了这个异常,而之前写这段代码的老大将这个异常给捕获,然后return ""了,所以我们看不到异常堆栈。
现在在想有什么好办法解决。
如堆栈里面打出来的一样。 真郁闷。
IllegalArgumentException
ERROR_NULL_ARGUMENT when point is null
ERROR_INVALID_ARGUMENT when there is no character at the specified location
at net.heartsome.xlfedit.view.XLFEditMain.show(XLFEditMain.java:4192)
if (!display.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
if (!display.isDisposed()) {
display.dispose();
}
这就是那个show方法里面的全部代码。
我通过十六进制编辑器看过了,只要StyleText文本框里的文本中包含有十六进制为 E2 80 A9 的字符的时候就会出现这个问题。