2011-01-22 10 views
6

現在、NetbeansでMIDlet(Visual MIDletを使用しています)を使用していて、NullPointerExceptionがスローされていますが、その理由はわかりません。J2ME(Java) - 表示クラスでヌルポインター例外がキャッチされました

注:プログラムがエミュレータで実行されているときに例外がスローされないのは、[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(これ)との警告を示しました。私は警告を鎮静化したinitialize()メソッドに移動しましたが、例外はまだ発生します。

ご協力いただきますようお願い申し上げます。

ありがとう、トム。

+0

1時間だけデバッグしますか?あなたはタンクにもっとたくさんあります。深刻なことに、深呼吸して数時間歩きます。あなたがSOの誰かが最初でないなら、間違いなくそれを得るでしょう。 – Mike

+0

Display.getDisplay(this)は、 'this'がコンストラクタをエスケープしているため、リークすると言われています。しかし、コンストラクタの設定に基づいて、これはNullPointerExceptionを引き起こす可能性は低いです(すべてが既に初期化されているため) –

答えて

3

EDIT:私が言ったことは関係ないと思うので、私の答えを修正する必要があるかもしれませんが、それは助けになる可能性のあるチャンスを残すでしょう!

私がJ2MEで作業して以来、長いことがありましたが、古いコードを見て、コンストラクタで役に立つものは一度もなかったことに気付きました。私は何かがまだ初期化されていないので、Display.getDisplay(あなた)への呼び出しがNullPtrExceptionを引き起こしていると賭けています。実際、このポインタをコンストラクタで使用することは、この種のエラーを引き起こすことはかなり確実です。

startApp()関数でDisplayを処理してみてください。私が参照しているこのコードが正しい場合は、MIDletがまだ初期化されているかどうかを示すブール値を保持する必要があります。あなたが参考のためにここに私の古いコードを見ることができます

http://code.google.com/p/jmingle/source/browse/trunk/src/org/oep/jmingle/JMingle.java#68

1

はたぶん、あなたは

form1.setCommandListener(これ)を追加する必要があります。

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

を欠いていたし、常にnullポインタ例外が発生しました...これはうまく動作しますが、我々のコードが複雑すぎるなったとき、あなたが順序で行う必要があります

+0

+1ありがとうございました、あなたはその部分で私を捕まえました –

0

^^あまりにも頻繁に我々はそれを忘れているようだ:

  • form1.setCommandListener
  • form1.addCommand ..
  • ....すべての後
  • を:MIDlet.getDisplay.setCurrent(form1);

あなたは、コマンドやリスナーを追加する前に 'setCurrent' を起動した場合form1の画面は引き続き表示されますが、コマンドを実行すると上記のエラーが発生します。