2011-01-22 3 views
6

Attualmente sto lavorando con MIDlet (utilizzo un MIDlet visivo) in Netbeans e viene generata una NullPointerException ma non so perché.J2ME (Java) - Eccezione puntatore nullo rilevata nella classe display

Nota: L'eccezione non viene generata quando il programma viene eseguito sull'emulatore, solo quando viene premuto il pulsante OK Comando.

Ecco l'errore che ottengo

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) 

ho spogliato fuori tutto il codice estranei a l'eccezione, in modo che si può leggere più facile. Di seguito è una versione semplificata se il codice che ho, che genera l'eccezione di cui sopra.

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

}

Ho cercato di risolvere questo per almeno un'ora, senza prevalere. L'unica cosa che posso pensare è degno di nota:

  • Netbeans ha mostrato un avviso con la linea Display.getDisplay (questo) ..... dicendo che c'era una perdita nel costruttore. L'ho spostato nel metodo initialize() che ha sedato l'avviso, ma l'eccezione si verifica ancora.

Qualsiasi aiuto sarà molto apprezzato.

Grazie, Tom.

+0

Eseguire il debug per solo un'ora? Hai di più nel serbatoio. Una nota seria, fai un respiro profondo e allontanati per qualche ora. Lo otterrai sicuramente se qualcuno su SO non è il primo. – Mike

+0

Si dice che display.getDisplay (this) perde perché 'this' sta sfuggendo al costruttore. In base alla configurazione del costruttore, tuttavia, è improbabile che ciò causi NullPointerEXception (dato che tutto è già stato inizializzato) –

risposta

3

EDIT: Potrei dover correggere la mia risposta perché penso che ciò che ho detto non sia pertinente, ma lascerò perdere la possibilità che possa essere d'aiuto!

E 'passato molto tempo da quando ho lavorato in J2ME, ma dopo aver guardato un vecchio codice ho notato che non ho mai fatto nulla di utile nel costruttore. Sto scommettendo che la tua chiamata a Display.getDisplay (this) sta causando una NullPtrException perché qualcosa non è ancora stato inizializzato. In effetti, sono abbastanza sicuro che l'uso di questo puntatore in un costruttore è abbastanza sicuro da causare questo tipo di errore.

Provare a trattare con Display nella funzione startApp(), e se questo codice a cui mi riferisco è corretto, si dovrebbe mantenere un booleano che segna se il MIDlet è stato inizializzato o meno.

Potete guardare qualche vecchio codice di mine qui per riferimento:

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

1

Forse avete bisogno di aggiungere

form1.setCommandListener (questo);

1

Ho anche notato che ....

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

mancava la

this.setCommandListener(this); 

e sempre ottenuto l'eccezione null-pointer ...Questo metodo funziona bene, ma sembra che ci dimentichiamo troppo spesso, quando il nostro codice diventa troppo complesso ^^

+0

+1 grazie, mi hai catturato per quella parte –

0

È necessario fare per:

  • form1.setCommandListener
  • form1.addCommand ..
  • ....
  • dopo tutto: MIDlet.getDisplay.setCurrent(form1);

Se si richiama 'setCurrent' prima di aggiungere i comandi e ascoltatore, i lo schermo di form1 appare ancora ma quando si preme un comando, si alza sopra l'errore.