2011-01-22 21 views
6

'da yakalandı Şu anda Netbeans'de MIDlet'lerle (Visual MIDlet kullanıyorum) çalışıyorum ve NullPointerException atılıyor ama nedenini bilmiyorum.J2ME (Java) - Null Pointer Exception Sınıfı

Not: Program, emülatörde çalışırken, yalnızca Tamam Komutu düğmesine basıldığında istisna atılmaz. İşte

Ben Kolay okunması böylece ben, istisna ile ilgili olmayan tüm kod dışarı çalmıştır

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) 

olsun hatadır. Aşağıda, yukarıdaki istisnayı atan kodun basitleştirilmiş bir sürümü var.

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

}

hiçbir hakim olan, en az bir saat boyunca bu çözmeye çalışıyorlar. Ben bahsetmemiz düşünebilirsiniz tek şey:

  • Netbeans yapıcı bir sızıntı olduğunu ifade etti ..... çizgi Display.getDisplay (this) ile bir uyarı gösterdi. Ben uyarıyı sedat veren initialize() yöntemine taşıdım, ancak istisna hala gerçekleşir.

Herhangi bir yardım büyük takdir edilecektir.

Teşekkürler, Tom.

+0

Yalnızca bir saat için hata ayıklama? Tankta daha çok var. Ciddi bir notta, derin bir nefes alın ve birkaç saatliğine yürüyün. SO üzerinde bir kişi ilk önce değilse kesinlikle alırsınız. – Mike

+0

Display.getDisplay (bu) sızdırıyor olduğu söylenir, çünkü 'bu' kurucudan kaçıyor. Ancak, kurucunuza bağlı olarak, bu NullPointerEXception (zaten her şey zaten başlatılmış olduğu gibi) –

cevap

3

DÜZENLEME: Cevabımı redaksiyona tabi tutmam gerekebilir çünkü söylediğim konuya uygun olmadığını düşünüyorum, ama yardımcı olamayacağına inanıyorum.

J2ME'de çalıştığımdan bu yana çok uzun zaman geçti, fakat eski bir kodu incelediğimde fark ettim ki yapıcıda hiç işe yaramadı. Ben bir şey henüz başlatılmamış çünkü Display.getDisplay (bu) bir NullPtrException neden çağrıya bahis kulüpler. Aslında, bir kurucudaki bu işaretçiyi kullanmanın bu tür bir hataya neden olacağı kesin olarak eminim.

Display with startApp() işleviyle uğraşmaya çalışın ve bu kodu kullanıyorum, doğruysa, MIDlet'in henüz başlatılmış olup olmadığını belirten bir boole tutmalısınız. Gerektiğinde başvurmak için buraya benim bazı eski koda bakabilir

:

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

1

Belki

form1.setCommandListener (bu) eklemeniz gerekir;

1

Ben de fark ....

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

Yoksun ve her zaman boş-işaretçi istisna var ...Bu iyi çalışıyor ama bizim kod ^^ çok karmaşık aldığında biz çok sık unutmak görünüyor

+0

+1 teşekkürler, bu bölüm beni yakaladı neden olma ihtimali yoktur –

0
Sen sırayla yapmanız gerekir

:

  • form1.setCommandListener
  • form1.addCommand ..
  • ....
  • sonuçta: MIDlet.getDisplay.setCurrent(form1);

komutları ve dinleyici, eklemeden önce 'setCurrent' çağırmak durumunda form1 ekranı hala görünüyor ancak bir komut düğmesine bastığınızda, bu hata üzerinde yükselir.