problema despues de compilar

phrancisco
01 de Julio del 2005
Saludos

Pues resulta que estoy aprendiendo J2ME ( o intentandolo) y he decicdido hacerme un programa que me calcule el gasto telefonico.Utlizo como editor notepad++ y para compilar J2ME Wireless Toolkit.El progama no me da ningun error durante la compilaci贸n, pero probandolo en el emulador al intentar realizar los calculos de la opci贸n1,esto es, cuando pulso el boton c, me aparcen en la ventana del J2ME Wireless Tollkit los siguientes errores:
java.lang.NullPointerException
at Escriba001a.getNumber(+1)
at Escriba001a.commandAction(+146)
at javax.microedition.lcdui.Display$DisplayAccesor.commandAction(+282)
etc
He buscado en la documentacion que acompa帽a al J2ME Wireless Tollkit informaci贸n acerca de la excepcci贸n, la he encontrado y no me entero de nada.Si algun alma caritativa me ayuda.Para mas informaci贸n el m茅todo getnumber y la manera de conseguir los datos de los textfields esta copiado/imitado del ejemplo FPDemo del J2ME Wireless Toolkit.Si quereis probar el programa por vuestra cuenta:

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Escriba001a extends MIDlet implements CommandListener {

// definicion de variables
private static final int NUM_TAM=100; // para evitar un problemilla
private static final double tar_llamadas = 0.21;
private static final double tar_sms = 0.15;
private static final double tar_mms = 0.90 ;
double gt_siniva = 0;
double gastototal = 0;
double iva = 16;
double porcentaje = 100;
double segmin = 60 ;
double gastollamada = 0;
double minutos = 0 ;
double segundos = 0;
String cadllam;
String cadtotal;
String s;
StringItem a2;
StringItem a3;
TextField intromin ;
TextField introseg ;
TextField introsms ;
TextField intromms ;
TextField gllamada ;
TextField gtotal ;
//TextField gsms ; no lo uso
//TextField gmms ; no lo uso
List menu;
Form formu1,formu2,formu3;
Display pantalla;
Command atras,salir,calcular;

public Escriba001a () {
pantalla = Display.getDisplay(this);

// creo los comandos
atras = new Command("Atras",Command.BACK,1);
salir = new Command("Salir",Command.EXIT,1);
calcular = new Command("C",Command.SCREEN,1);

// creo el menu y todas sus cositas
menu = new List("Men煤",List.IMPLICIT);
menu.insert(0,"Opcion3",null);
menu.insert(0,"Opcion2",null);
menu.insert(0,"Opcion1",null);
menu.addCommand(salir);
menu.setCommandListener(this);

// creo el contenido del formu1 para calcular el gasto en llamadas
TextField intromin = new TextField("Minutos", "0", NUM_TAM,TextField.DECIMAL);
TextField introseg = new TextField("Segundos", "0", NUM_TAM,TextField.DECIMAL);
TextField gllamada = new TextField("Gasto de la llamada", "0", NUM_TAM,TextField.UNEDITABLE);
TextField gtotal = new TextField("Gasto Total", "0", NUM_TAM,TextField.UNEDITABLE);
formu1 = new Form("Formulario 1");
formu1.append(intromin);
formu1.append(introseg);
formu1.append(gllamada);
formu1.append(gtotal);
formu1.addCommand(atras);
formu1.addCommand(calcular);
formu1.setCommandListener(this);

// creo el formulario 2 que deberia calcular el gasto de los sms
StringItem a2 = new StringItem("Info:","Proximamente",Item.PLAIN);
formu2 = new Form("Formulario 2");
formu2.append(a2);
formu2.addCommand(atras);
formu2.setCommandListener(this);

// creo el formulario 3 que deberia calcular el gasto de los mms
StringItem a3 = new StringItem("Info:","Proximamente",Item.PLAIN);
formu3 = new Form("formulario 3");
formu3.append(a3);
formu3.addCommand(atras);
formu3.setCommandListener(this);
}

double getNumber(TextField t, String type) {
String s = t.getString();
double n;
n = Double.parseDouble(s);
return n;
}



public void startApp() {
pantalla.setCurrent(menu); // Pongo el menu en pantalla
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c, Displayable d){
if (c == menu.SELECT_COMMAND){
switch(menu.getSelectedIndex()){
case 0:{ pantalla.setCurrent(formu1);break;}
case 1:{ pantalla.setCurrent(formu2);break;}
case 2:{ pantalla.setCurrent(formu3);break;}
}
}
else if (c == atras){
pantalla.setCurrent(menu);
}
else if (c == salir){
destroyApp(false);
notifyDestroyed();
}
else if (c == calcular){
double minutos = getNumber(intromin,"primero");
double segundos = getNumber(introseg,"segundo");
gastollamada = (((minutos * segmin) + segundos) * tar_llamadas)/ segmin ;
gt_siniva =gt_siniva + gastollamada;
gastototal = (gt_siniva * iva)/ porcentaje;

String cadllam = Double.toString(gastollamada);
gllamada.setString(cadllam);

String cadtotal = Double.toString(gastototal);
gtotal.setString(cadtotal);
}
}
}

Jose
01 de Julio del 2005
Que la compilaci贸n no te haya dado errores no quiere decir que el programa te vaya a funcionar correctamente. El compilador solo revisa que la sintaxis sea la correcta, y no que la logica de tu programa est茅 bien. (como va a saber el compilador la logica que est茅s usando?). Mira este ejemplo:

TextField Campo;

//.... m谩s abajo o dentro de una funcion:
Campo.setText("prueba");

Esto cuando lo compiles no te va a dar ning煤n error, ya que la sintaxis es correcta, pero cuando lo ejecutes te va a dar error irremediablemente, ya que 'Campo' no est谩 inicializado.

Ese error de NullPointerException sale muy a menudo y quiere decir que no se ha inicializado algun objeto, y por lo tanto no se pueden usar sus metodos y propiedades sin inicializarlo. Usa el depurador y ponte justo en esta linea:

double minutos = getNumber(intromin,"primero");

seguro que intromin o introseg cuando llegan a la llamada de getNumber(...) valen null.

phrancisco
01 de Julio del 2005
Muchas gracias, hare lo que me dices y probare con el depurador