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

}

私はこれを少なくとも1時間解決しようとしましたが、勝てませんでした。言及する価値があると私が考えることができる唯一のことは次のとおりです。

  • Netbeans は、 Display.getDisplay(this).....行でコンストラクターにリークがあることを示す警告を表示しました。警告を鎮静化する initialize() メソッドに移動しましたが、例外は引き続き発生します。

どんな助けでも大歓迎です。

ありがとう、トム。

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(これ);

于 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 に答える