我只是想弄清楚为什么我会出错的逻辑。我试图第一次在1中添加2个显示,并使用commandListener切换视图。我逻辑上认为我做对了所有事情,但是我得到了空指针异常。我从不希望知道答案,我很努力地工作,所以也许有人可以问我一个关于我要达到的目标的问题,这可以使我用您的线索或提示来思考答案。将不胜感激。

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class ClassApp extends MIDlet implements CommandListener {
    private Display mydisplay;

    private TextBox d;
    private Alert alert;
    private Command c,e,f,mNextCommand,l;
    private List mList;

    public ClassApp(){

        alert = new Alert("Listen", "Do you really want to start this app?", null, null);
        alert.setTimeout(Alert.FOREVER);

        c = new Command("Exit", Command.EXIT, 2);
        e = new Command("Back", Command.BACK, 0);
        f = new Command("Alert", Command.SCREEN, 3);
        mNextCommand = new Command("Next", Command.SCREEN, 4);
        l = new Command("List", Command.SCREEN, 3);


        d = new TextBox("ClassApp", "Commander", 20, TextField.ANY | TextField.PASSWORD);
        d.addCommand(c);
        d.addCommand(e);
        d.addCommand(f);
        d.addCommand(l);
        d.setCommandListener(this);
        mList.addCommand(mNextCommand);
        mList.setCommandListener(this);


        String[] stringElements = { "Airplane", "Car", "Hotel" };
        Image[] imageElements = { loadImage("/airplane.png"),
        loadImage("/car.png"), loadImage("/hotel.png") };

        mList = new List("Reservation type", List.IMPLICIT,
        stringElements, imageElements);




    }
    public void startApp()
    {

        mydisplay = Display.getDisplay(this);
        mydisplay.setCurrent(d);

    }
    public void commandAction(Command j, Displayable s)
            {
                if(j == f)
                    mydisplay.setCurrent(alert);
                if(j == l)
                    mydisplay.setCurrent(mList);
                if (j == mNextCommand || j == List.SELECT_COMMAND) {
                int index = mList.getSelectedIndex();
                Alert alert2 = new Alert("Your selection",
                "You chose " + mList.getString(index) + ".",
                null, AlertType.INFO);
                mydisplay = Display.getDisplay(this);
                mydisplay.setCurrent(alert2, mList);
        }

                else if(j == c)
                    notifyDestroyed();
            }





    public void pauseApp() { }
    public void destroyApp(boolean unconditional) { }
    private Image loadImage(String name) {
        Image image = null;
        try {
        image = Image.createImage(name);
        }
        catch (IOException ioe) {
        System.out.println(ioe);
        }
        return image;
    }
}

我得到的错误是:
Starting emulator in execution mode
Installing suite from: http://127.0.0.1:2913/ClassApp.jad
java.lang.NullPointerException:   0
    at ClassApp.<init>(ClassApp.java:33)
    at java.lang.Class.newInstance(), bci=0
    at com.sun.midp.main.CldcMIDletLoader.newInstance(), bci=46
    at com.sun.midp.midlet.MIDletStateHandler.createMIDlet(), bci=66
    at com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet(), bci=17
    at com.sun.midp.midlet.MIDletStateHandler.startSuite(), bci=27
    at com.sun.midp.main.AbstractMIDletSuiteLoader.startSuite(), bci=52
    at com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(), bci=8
    at com.sun.midp.main.AbstractMIDletSuiteLoader.runMIDletSuite(), bci=161
    at com.sun.midp.main.AppIsolateMIDletSuiteLoader.main(), bci=26

最佳答案

也许任何人都可以问我有关我要达到的目标的问题,这可能使我想到使用您的线索或提示的答案...

好,我们走了。

错误消息的ClassApp.java:33部分告诉您ClassApp.java中的哪一行代码有问题。旁注神秘的部分ClassApp.<init>告诉您ClassApp构造函数中正在发生不好的事情。

如果从顶部数到第33行,您可能会发现:

    mList.addCommand(mNextCommand);

现在,如果您寻找在构造函数内部如何处理mList的方式(大约需要检查20行),您会发现一个有趣的事实,它将指导您在此处查找错误所在。

值得一提的是,调查此类错误的另一件事是堆栈跟踪顶部显示的名称NullPointerException。它翻译成人类语言

在不应该存在的地方有null值。

这通常表明您可能已经注意到,某些变量没有正确分配。

PS。

我将继续寻求更好的效率(例如将代码移入startapp)

startApp进行初始化实际上是可靠性问题,而不是效率问题。

建议使用startApp而不是构造函数进行初始化。例如,在MIDlet Life Cycle -> Execution States教程中对此进行了说明:“通常,您将使用startApp()分配记录存储,网络连接,UI组件等。”

据我了解,还没有确定可以在构造函数中安全初始化的内容的明确列表。因此,我尝试在startApp中进行尽可能多的初始化-这样,我就不必为规范它是否安全而烦恼规范中的繁琐检查。

10-05 19:04