problema despues de compilar
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);
}
}
}
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);
}
}
}
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.
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.
