Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NullPointerException试图在一个移动应用程序中添加2个可显示项_Java_Java Me_Nullpointerexception_Midp_Lcdui - Fatal编程技术网

Java NullPointerException试图在一个移动应用程序中添加2个可显示项

Java NullPointerException试图在一个移动应用程序中添加2个可显示项,java,java-me,nullpointerexception,midp,lcdui,Java,Java Me,Nullpointerexception,Midp,Lcdui,我只是想弄明白为什么我会出错。我第一次尝试在1中添加2个显示,并使用commandListener切换视图。从逻辑上讲,我认为我做的一切都是对的,但我得到了一个空指针异常。我从来不想知道答案,我喜欢努力工作,所以如果有人能问我一个问题,关于我正在努力实现的目标,这可以引导我使用你的线索或提示来思考答案。我们将不胜感激 import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*;

我只是想弄明白为什么我会出错。我第一次尝试在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
以执行模式启动emulator
从以下位置安装套件:http://127.0.0.1:2913/ClassApp.jad
java.lang.NullPointerException:0
在ClassApp。(ClassApp.java:33)
在java.lang.Class.newInstance()中,bci=0
在com.sun.midp.main.CldcMIDletLoader.newInstance()上,bci=46
在com.sun.midp.midlet.MIDletStateHandler.createMIDlet()上,bci=66
在com.sun.midp.midlet.MIDletStateHandler.createAndRegisterMIDlet()上,bci=17
在com.sun.midp.midlet.MIDletStateHandler.startSuite()上,bci=27
位于com.sun.midp.main.AbstractMidleSuiteLoader.StartSite(),bci=52
位于com.sun.midp.main.CldcMIDletSuiteLoader.startSuite(),bci=8
位于com.sun.midp.main.AbstractMidleSuiteLoader.RunMidleSuite(),bci=161
在com.sun.midp.main.AppIsolateMidleSuiteLoader.main()上,bci=26
也许如果有人能问我一个问题,关于我正在努力实现的目标,这可以引导我使用你的线索或提示来思考答案

好的,我们开始吧

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

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

    mList.addCommand(mNextCommand);
现在,如果您想了解构造函数中如何处理
mList
(大约有20行需要检查),您将发现一个有趣的事实,它将指导您找到错误所在


另一件值得记住的事情是,在堆栈跟踪顶部显示的名称
NullPointerException
。它被翻译成人类语言

null
值不应该存在的地方

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


附言

我将继续寻求更高的效率(比如将代码移到startapp中)

在startApp中初始化与其说是效率问题,不如说是可靠性问题

建议在
startApp
而不是构造函数中初始化两件事。例如,教程中解释了这些内容:“通常,您将使用startApp()分配记录存储、网络连接、UI组件等…”


据我所知,并没有明确的清单可以保证在构造函数中安全初始化什么。正因为如此,我尝试在
startApp
中尽可能多地进行初始化,这样,我就不需要在规范中麻烦地检查它是否安全了。

@Addy75祝你好运。虽然我有你的注意-考虑移动代码现在你在构造函数进入<代码> StaspApp/<代码> -一些(BUGGY)设备可能“喜欢”它写的好!只是我的位置。无法向尚未创建的内容添加命令。现在它正在工作,但仅仅因为它在工作并不意味着它是最好的编码方式,所以我将继续寻找更好的效率(比如将代码移动到startapp),所以我将把这个标记为已回答,但如果您有任何更多的评论,请随意。谢谢你们。我真的很感激@在
startApp
中添加75初始化是可靠性问题,而不是效率问题-我用更多的细节扩展了答案谢谢您的扩展和教程链接!