2011-01-22 51 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"); 
     } 
    } 

}

我一直在試圖解決這個問題,至少一個小時,沒有佔上風。 我能想到的值得一提的唯一的一點是:

  • 的Netbeans顯示一個警告與線Display.getDisplay(本).....稱沒有在構造函數中泄漏。我將它移入了初始化()方法,該方法已經調整了警告,但仍然發生異常。

任何幫助將不勝感激。

謝謝,湯姆。

+0

調試只需一個小時?你有更多的坦克。嚴肅地說,深吸一口氣,走幾個小時。如果SO上的某個人不首先,你一定會得到它。 – Mike 2011-01-22 23:06:48

+0

Display.getDisplay(this)據說泄漏,因爲'this'正在逃離構造函數。然而,根據你的構造函數設置,這不太可能導致NullPointerEXception(因爲所有東西都已經初始化) – 2011-01-24 15:46:07

回答

3

編輯:我可能需要編輯我的答案,因爲我認爲我所說的不相關,但我會放棄它的機會,它可以幫助!

從我在J2ME工作已經很長時間了,但看過一些我注意到的舊代碼,我從來沒有在構造函數中做過任何有用的東西。我打賭你對Display.getDisplay(this)的調用導致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); 

,並始終得到了空指針異常...這種運作良好,但似乎我們忘記它往往當我們的代碼變得太複雜^^

0

您必須做到:

  • form1.setCommandListener
  • form1.addCommand ..
  • 如果您添加的命令和聽衆中,援引 '的setCurrent' MIDlet.getDisplay.setCurrent(form1);

:....

  • 畢竟form1屏幕仍然出現,但是當你點擊一個命令時,它會引發錯誤。