【问题标题】:NullPointer Exception in OnclickOnclick 中的 NullPointer 异常
【发布时间】:2014-02-15 11:37:26
【问题描述】:

我在单击 GWT 中的按钮时遇到 NullPointer 异常,有人可以建议我如何继续调试问题吗?我在这里发布了代码的 sn-p。

我有一个在创建时创建电影票的表单,如果用户决定不这样做,则取消。取消时,它成功加载回第一个表单,但父表单按钮在单击时引发空指针异常。

注意:如果我不加载 createMovie 页面,这些父按钮可以正常工作。

createMovie.class

public void init( ClickListener listener )
    {

    // code ...
    // ........

     cancel.addClickListener( listener );  
     createMovie.add( header );
     createMovie.add( table );
     createMovie.setHeight( "663px" );

     initWidget( createMovie ); 

    }

在 FocusWidget.class 中

    public void addClickListener(ClickListener listener) {
    if (clickListeners == null) {
      clickListeners = new ClickListenerCollection();
      sinkEvents(Event.ONCLICK);
    }
    clickListeners.add(listener);
    }

// code

 @Override
  public void onBrowserEvent(Event event) {
    switch (DOM.eventGetType(event)) {
      case Event.ONCLICK:
        if (clickListeners != null) {
          clickListeners.fireClick(this);   ------->>> LINE 102
        }
        break;

      case Event.ONBLUR:
      case Event.ONFOCUS:
        if (focusListeners != null) {
          focusListeners.fireFocusEvent(this, event);
        }
        break;

      case Event.ONKEYDOWN:
      case Event.ONKEYUP:
      case Event.ONKEYPRESS:
        if (keyboardListeners != null) {
          keyboardListeners.fireKeyboardEvent(this, event);
        }
        break;
    }
  }

在 ClickListenerCollection.class 中

public void fireClick(Widget sender) {
    for (ClickListener listener : this) {
      listener.onClick(sender);
    }
    }

错误:

[ERROR] Uncaught exception escaped
java.lang.NullPointerException: null
    at com.google.gwt.user.client.ui.ClickListenerCollection.fireClick(ClickListenerCollection.java:34)
    at com.google.gwt.user.client.ui.FocusWidget.onBrowserEvent(FocusWidget.java:102)
    at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1308)
    at com.google.gwt.user.client.DOM.dispatchEventAndCatch(DOM.java:1287)
    at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1255)
    at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

【问题讨论】:

  • 这可能不是你麻烦的根源,但addClickListener已被弃用,你应该真正使用addClickHandler

标签: java gwt actionlistener onclicklistener


【解决方案1】:

NullPointerException 表示您正试图在空对象上运行某些东西。 (嗯,不完全是,但基本上就是这样。)

首先,学习如何读取堆栈跟踪。这是一项非常重要的技能。基本上,沿着堆栈向下走,直到找到属于您的文件。在这种情况下,它是 FocusWidget:102。由于我不知道第 102 行是哪一行,所以我只是猜测。

由于您似乎暗示错误在该代码 sn-p 中,并且 if 语句中的任何内容都不能为空,因为您正在检查它,我的猜测是,不知何故,参数“监听器”是无效的。不过,我不确定。如果您能向我们提供导致问题的整个代码块,即第 102 行附近的范围,将会很有帮助。

【讨论】:

  • 添加了代码行 102 & 我正在读取堆栈并试图找到问题。如果我不去 createMovie 表单,它会起作用。
  • 啊。好吧,那里有两个元素:clickListener 和“this”。如果前者不为空,则它必须是后者。所以不知何故,“this”是空的。
【解决方案2】:

我已经解决的问题,

我在两种形式(父和子)中都有取消按钮,并且在 createMovie.class(子)中调用“取消”时,我正在删除父表单。因此,当我尝试在子表单( createMovie )中按“取消”时,侦听器正在传递 Null。

修复

            if ( childFormLoaded )
            {
                if ( panelsControl.containsPanel( createMovie.class.getName() ) )
                    panelsControl.removePanel( createMovie.class.getName() );
            }
            else
            {
                if ( panelsControl.containsPanel( ParentClass.class.getName() ) )
                    panelsControl.removePanel( ParentClass.class.getName() );
            }

【讨论】:

    猜你喜欢
    • 2014-01-31
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多