6

我目前正在 Netbeans 中使用 MIDlet(我正在使用 Visual MIDlet),并且正在抛出 NullPointerException 但我不知道为什么。

注意:程序在模拟器上运行时不会抛出异常,只有在按下 OK 命令按钮时才会抛出异常。

这是我得到的错误

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");
        }
    }

}

我一直试图解决这个问题至少一个小时,但没有成功。我能想到的唯一值得一提的是:

  • Netbeans 使用Display.getDisplay(this).....行显示警告,表示构造函数中存在泄漏。我将它移到了初始化()方法中,该方法消除了警告,但异常仍然发生。

任何帮助将不胜感激。

谢谢,汤姆。

4

4 回答 4

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

于 2011-01-24T04:49:37.573 回答
1

也许你需要添加

form1.setCommandListener(this);

于 2011-01-24T15:33:26.560 回答
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);

并且总是得到空指针异常......这很好,但是当我们的代码变得太复杂时,我们似乎经常忘记它^^

于 2011-06-24T04:59:56.267 回答
0

您必须按顺序执行:

  • form1.setCommandListener
  • form1.addCommand..
  • ……
  • 毕竟:MIDlet.getDisplay.setCurrent(form1);

如果您在添加命令和侦听器之前调用“setCurrent”,form1 屏幕仍然会出现,但是当您点击命令时,它会引发上述错误。

于 2012-06-26T17:50:38.687 回答