我有一个程序里面用到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)

解决方案 »

  1.   

    这个异常不是从我的代码里面抛出来的,不知道该贴哪里呀。
    at net.heartsome.xlfedit.view.XLFEditMain.show(XLFEditMain.java:4192)
    at net.heartsome.xlfedit.view.XLFEditMain.main(XLFEditMain.java:4207)
    这两行是display分发事件的循环。
      

  2.   

    你如何创建StyleText,以及调用这个控件哪些方法?
    贴合上面相关的。
      

  3.   

    source = new StyledText(sourceForm, SWT.V_SCROLL | SWT.READ_ONLY
    | 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方法。
      

  4.   

    大哥你太帅了
    问题果然出在getOffsetAtLocation方法,因为该点没有指定的字符抛出了这个异常,而之前写这段代码的老大将这个异常给捕获,然后return ""了,所以我们看不到异常堆栈。
    现在在想有什么好办法解决。
      

  5.   

    大哥,貌似问题不在我们自己调的这里,仔细看了那段程序,捕获异常并返回一个空是没问题的,并不会导致程序Crash,导致Crash的问题还是出自内部调用了这个getOffsetAtLocation的方法。
    如堆栈里面打出来的一样。 真郁闷。
      

  6.   

    应该是你掉getOffsetAtLocation方法的时候,传入的参数的问题。
      

  7.   

    文档:
    IllegalArgumentException 
    ERROR_NULL_ARGUMENT when point is null 
    ERROR_INVALID_ARGUMENT when there is no character at the specified location 
      

  8.   

    这段文档我看过了,现在的问题是,我调用该方法时捕获了该异常,并处理了,但这个异常依然被抛出,根据异常堆栈,我查了一下SWT的源码,该异常是SWT里内部方法调用时抛出的。我总不能去改SWT的源码吧。
      

  9.   

    我能看看这块代码么?
    at net.heartsome.xlfedit.view.XLFEditMain.show(XLFEditMain.java:4192) 
      

  10.   

    while (!shell.isDisposed()) {
    if (!display.isDisposed()) {
    if (!display.readAndDispatch()) {
    display.sleep();
    }
    }
    }
    if (!display.isDisposed()) {
    display.dispose();
    }
    这就是那个show方法里面的全部代码。
    我通过十六进制编辑器看过了,只要StyleText文本框里的文本中包含有十六进制为 E2 80 A9 的字符的时候就会出现这个问题。
      

  11.   

    经Eclipse新闻组确定,该问题是SWT的一个BUG,在Eclipse 3.4M5 的包中还未解决,不知道何时可以处理。