3

エラーが発生した理由の論理を理解しようとしています。初めて1つに2つのディスプレイを追加し、commandListenerを使用してビューを切り替えようとしています。論理的にはすべて正しく行ったと思いましたが、nullポインター例外が発生します。答えを知りたくありません。一生懸命働くのが楽しいので、誰かが私が達成しようとしていることについて質問してくれれば、あなたの手がかりやヒントを使って答えを考えることができます。よろしくお願いします。

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
4

1 に答える 1

2

多分誰かが私が達成しようとしていることについて私に質問をすることができれば、それは私があなたの手がかりやヒントを使って答えを考えるように導くことができます...

OK、どうぞ。

ClassApp.java:33エラーメッセージの一部には、ClassApp.javaのコードのどの行に問題があるかが示されています。サイドノートの不可解な外観の部分ClassApp.<init>は、ClassAppコンストラクター内で悪いことが起こっていることを示しています。

上から33行目を数えると、おそらく次のようになります。

    mList.addCommand(mNextCommand);

ここで、コンストラクター内でどのように処理されるかを探すとmList(チェックする行が約20行あります)、そこで何が間違っているかを見つけるのに役立つ1つの面白い事実が見つかります。


そのようなバグを調査することを覚えておく価値のあるもう1つのことは、NullPointerExceptionスタックトレースの上部に表示される名前です。それは次のように人間の言語に翻訳されます

nullあるべきではないところに価値があります。

これは、おそらくすでに気付いているように、一部の変数が適切に割り当てられていないことを示していることがよくあります。


PS。

私はより良い効率を探し続けます(コードをstartappに移動するなど)

初期化はstartApp、効率よりも信頼性の問題です。

startAppコンストラクターの代わりに初期化することが推奨されることがいくつかあります。これらは、たとえばチュートリアルMIDletライフサイクル->実行状態で説明されています:「通常、startApp()を使用して、レコードストア、ネットワーク接続、UIコンポーネントなどを割り当てます...」

私が理解している限り、コンストラクターで安全に初期化されることが保証されているものの明確なリストはありません。そのため、私は可能な限り多くの初期化を行うようにしていますstartApp-そのようにして、安全かどうかの仕様の面倒なチェックに煩わされる必要はありません。

于 2012-04-19T16:15:46.663 に答える