点击GWT中的按钮,我面临NullPointer异常,有人可以建议我如何继续调试问题吗?我在这里发布了代码片段。
我有一个在创建时创建电影票的表单,如果用户决定不这样做则取消。取消时,它会成功加载回第一个表单,但父表单按钮会在单击时抛出空指针异常。
注意:如果我不加载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)
答案 0 :(得分:3)
NullPointerException意味着您正在尝试在null对象上运行某些东西。 (嗯,不完全是,但基本上就是这样。)
首先,学习如何读取堆栈跟踪。这是一项非常重要的技能。基本上,沿着堆栈向下,直到找到属于您的文件。在这种情况下,它是FocusWidget:102。由于我不知道102行是哪一行,我只是想猜。
由于您似乎暗示错误在该代码片段中,并且if语句中的任何内容都不能为null,因为您正在检查它,我的猜测是以某种方式参数“listener”为null。不过我不确定。如果您能够提供导致问题的整个代码块,即第102行的范围,那将会很有帮助。
答案 1 :(得分:2)
我已经做了很多事情来修复,
我在两种形式(父母和孩子)中都有取消按钮,并且在createMovie.class(child)中调用'cancel'时,我正在删除父窗体。因此,当我试图按子窗体(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() );
}