我目前正在使用Netbeans中的MIDlets(我正在使用Visual MIDlet),并且正在抛出NullPointerException,但我不知道为什么。
注意:只有在按下“确定命令”按钮时,程序在模拟器上运行时才会抛出异常。
这是我得到的错误
TRACE: <at java.lang.NullPointerException: 0>, Exception caught in Display class
java.lang.NullPointerException: 0
at javax.microedition.lcdui.Display$ChameleonTunnel.callScreenListener(), bci=46
at com.sun.midp.chameleon.layers.SoftButtonLayer.processCommand(), bci=74
at com.sun.midp.chameleon.layers.SoftButtonLayer.soft1(), bci=37
at com.sun.midp.chameleon.layers.SoftButtonLayer.keyInput(), bci=36
at com.sun.midp.chameleon.CWindow.keyInput(), bci=38
at javax.microedition.lcdui.Display$DisplayEventConsumerImpl.handleKeyEvent(), bci=17
at com.sun.midp.lcdui.DisplayEventListener.process(), bci=277
at com.sun.midp.events.EventQueue.run(), bci=179
at java.lang.Thread.run(Thread.java:619)
我删除了与异常无关的所有代码,以便您可以更轻松地阅读它。 下面是我所拥有的代码的简化版本,它抛出了上述异常。
package stMidlet;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class StoryMidlet extends MIDlet implements CommandListener {
private boolean midletPaused = false;
private Command commandOk1;
private Form form1;
private TextField textField1;
public StoryMidlet() {
commandOk1 = new Command("Ok", Command.OK, 1);
textField1 = new TextField("Enter value: ", null, 120, TextField.ANY);
form1 = new Form(null, new Item[]{textField1});
form1.addCommand(commandOk1);
Display.getDisplay(this).setCurrent(form1);
}
/* There were some methods here pre-inserted by netbeans. */
/* I have not changed these, but I can post them if you need me too */
/* initialize() */
/* startMIDlet() */
/* resumeMidlet() */
/* switchDisplayable */
/* getDisplay() */
/* exitMidlet() */
/* startApp() */
/* pauseApp() */
/* destroyApp() */
public void commandAction(Command c, Displayable d) {
if (c == commandOk1)
{
System.out.println("Test");
}
}
}
我一直试图解决这个问题至少一个小时,没有任何优势。 我能想到的唯一值得一提的是:
非常感谢任何帮助。
谢谢,汤姆。
答案 0 :(得分:3)
自从我在J2ME工作已经有很长一段时间了,但是看了一些旧的代码,我注意到我从未在构造函数中做过任何有用的事情。我打赌你对Display.getDisplay(this)的调用导致了NullPtrException,因为还没有初始化。事实上,我很确定在构造函数中使用this指针肯定会导致这种类型的错误。
尝试在startApp()函数中处理Display,如果我所指的代码是正确的,你应该保留一个布尔值来标记你的MIDlet是否已经初始化。
你可以在这里查看我的一些旧代码以供参考:
http://code.google.com/p/jmingle/source/browse/trunk/src/org/oep/jmingle/JMingle.java#68
答案 1 :(得分:1)
也许你需要添加
形成1.set CommandListener(this);
答案 2 :(得分:1)
我也注意到了......
public Welcome(String k, ChatApp c) {
super(k);
name = new TextField("Name", "", 140, TextField.ANY);
exit = new Command("Exit", Command.EXIT, 0);
enter = new Command("Enter", Command.OK, 0);
midlet = c;
this.append(name);
this.addCommand(exit);
this.addCommand(enter);
}
缺乏
this.setCommandListener(this);
总是得到空指针异常......这很好用但是当我们的代码太复杂时我们似乎经常忘记它^^
答案 3 :(得分:0)
你必须按顺序做:
MIDlet.getDisplay.setCurrent(form1);
如果在添加命令和侦听器之前调用'setCurrent',则仍然会出现form1屏幕,但是当您点击命令时,它会引发错误。