2011-01-22 9 views
6

Actualmente estoy trabajando con MIDlets (estoy usando un MIDlet visual) en Netbeans, y se está lanzando una NullPointerException, pero no sé por qué.J2ME (Java) - Excepción del puntero nulo capturada en la clase de pantalla

Nota: La excepción no se produce cuando el programa se ejecuta en el emulador, solo cuando se presiona el botón de comando OK.

Aquí está el error que consigo

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) 

He despojado a cabo todo el código no relacionado con la excepción, por lo que se puede leer que sea más fácil. A continuación se muestra una versión simplificada si el código que tengo, que arroja la excepción anterior.

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

}

que han estado tratando de resolver esto por lo menos una hora, sin que prevalezca. La única cosa que puedo pensar en la pena mencionar es:

  • Netbeans mostraron una advertencia con la línea de Display.getDisplay (este) ..... diciendo que había una fuga en el constructor. Lo moví al método initialize() que sedado la advertencia, pero la excepción todavía ocurre.

Cualquier ayuda será muy apreciada.

Gracias, Tom.

+0

Depurando por solo una hora? Tienes más en el tanque. En una nota seria, tome una respiración profunda y aléjese durante unas horas. Definitivamente lo obtendrás si alguien en SO no lo hace primero. – Mike

+0

Se dice que Display.getDisplay (this) tiene fugas porque 'this' está escapando del constructor. Sin embargo, según la configuración de tu constructor, es poco probable que cause NullPointerEXception (ya que todo se ha inicializado) –

Respuesta

3

EDITAR: Podría necesitar redactar mi respuesta porque creo que lo que dije no es relevante, pero lo dejo en la remota posibilidad de que pueda ayudar.

Ha pasado mucho tiempo desde que trabajé en J2ME, pero después de haber analizado un código antiguo noté que nunca hice nada tan útil en el constructor. Apuesto a que su llamada a Display.getDisplay (esto) está causando una NullPtrException porque algo no se ha inicializado aún. De hecho, estoy bastante seguro de que usar este puntero en un constructor es bastante probable que cause este tipo de error.

Trate de tratar con Pantalla en la función startApp(), y si este código me refiero es correcto, debe mantener un booleano que marque si su MIDlet se ha inicializado o no.

Usted puede mirar en algún viejo código mío aquí por referencia:

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

1

Tal vez es necesario agregar

form1.setCommandListener (this);

1

También me di cuenta que ....

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

carecía de la

this.setCommandListener(this); 

y siempre tiene la excepción nula triple ...Esto funciona bien, pero parece que lo olvidamos demasiado a menudo cuando nuestro código se vuelve demasiado compleja ^^

+0

+1 gracias, me pillaste en esa parte –

0

Usted debe hacer con el fin:

  • form1.setCommandListener
  • form1.addCommand ..
  • ....
  • después de todo: MIDlet.getDisplay.setCurrent(form1);

Si se invoca 'setCurrent' antes de añadir los comandos y oyente, las La pantalla de form1 aún aparece pero cuando presionas un comando, se genera el error anterior.

Cuestiones relacionadas