Foros del Web » Programación para mayores de 30 ;) » Java »

Errror NullPointer Exeception

Estas en el tema de Errror NullPointer Exeception en el foro de Java en Foros del Web. Buenas... Tengo dos clases (Mapa y tablero). Desde Tablero llamo a Mapa para que me devuelva y asigne el valor de una matriz a una ...
  #1 (permalink)  
Antiguo 28/04/2014, 06:03
 
Fecha de Ingreso: diciembre-2007
Mensajes: 24
Antigüedad: 16 años, 4 meses
Puntos: 0
Errror NullPointer Exeception

Buenas...

Tengo dos clases (Mapa y tablero). Desde Tablero llamo a Mapa para que me devuelva y asigne el valor de una matriz a una matriz que he definido dentro de Mapa... Al recorrer la matriz para que se llene de valores, me da error a ejecutar ... un NullPointerException...

Código:
Clase Mapa
Public class Mapa
{
public int [][] mapa;

    public Mapa()
    {
      int[][] mapa={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,2,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,2,0},{0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0},{0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0},{0,1,0,1,0,0,1,0,0,3,3,0,0,1,0,0,1,0,1,0},{0,1,1,1,1,1,1,0,3,3,3,3,0,1,1,1,1,1,1,0},{0,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0},{0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0},{0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0},{0,2,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,2,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

    }
public int getMap(int  fil, int col)
 {
              
        return mapa[fil][col];
 }
}
public class Tablero extends JPanel implements ActionListener
{
Mapa plano;
int posX=105;
int posY=100;
int [][] mapa;
public Tablero()
    {
        mapa= new int [11][20];
rellenar()
}
public void rellenar()
    {
        for (int i=0; i<11; i++)
            {
                for (int j=0; j<20; j++)
                {
                        mapa[i][j]=plano.getMap(i,j); // Error NullPointerException
                        System.out.print(mapa[i][j]);
                }
            }
    }
}
  #2 (permalink)  
Antiguo 28/04/2014, 06:08
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Errror NullPointer Exeception

Mapa plano;
...
public Tablero()
{
plano = new Mapa(); // Te faltaría esto
mapa= new int [11][20];
rellenar()
}

...
mapa[i][j]=plano.getMap(i,j); // Error NullPointerException
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 28/04/2014, 06:16
 
Fecha de Ingreso: diciembre-2007
Mensajes: 24
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Errror NullPointer Exeception

Gracias, pero hay algo más que falla...

Ya que ahora después de instanciarlo... el valor que me imprime en mapa[i][j] siempre es 0...
  #4 (permalink)  
Antiguo 28/04/2014, 06:40
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Errror NullPointer Exeception

Estás declarando un atributo int [][] mapa; en la clase Mapa, pero estás rellenando en el constructor una variable local del constructor ya que la declaras otra vez

Código Java:
Ver original
  1. public Mapa()
  2.     {
  3.       int[][] mapa={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,2,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,2,0},{0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0},{0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0},{0,1,0,1,0,0,1,0,0,3,3,0,0,1,0,0,1,0,1,0},{0,1,1,1,1,1,1,0,3,3,3,3,0,1,1,1,1,1,1,0},{0,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0},{0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0},{0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0},{0,2,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,2,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
  4.  
  5.     }

cuando el constructor termina, ese int [][] mapa que declaras dentro desaparece y te queda el atributo int [][] mapa que sigue sin rellenar. Dicho de otra forma, tienes dos mapa distintos

Código Java:
Ver original
  1. public class Mapa {
  2.  
  3.     public int [][] mapa;  // Esta es distinta de
  4.  
  5.     public Mapa()
  6.     {
  7.           int[][] mapa = .... ; // esta otra.
  8.     }


Quita "int [][]" en el constructor y deja "mapa = {{,,,,,}}"

se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 28/04/2014, 12:03
 
Fecha de Ingreso: abril-2014
Mensajes: 2
Antigüedad: 10 años
Puntos: 0
Respuesta: Errror NullPointer Exeception

Hola buenas tardes, yo tambien tengo un problema de nullPointerException que no se muy bien como solucionar, me explico, se trata de una interfaz grafica swing que consiste en el juego ahorcado, cuando se da al boton "jugar", se instancia un nuevo ahorcado con una palabra elegida al azar de un xml. Luego deberemos dar a los botones en los que estan las letras para ir acertando la palabra. El problema es este, que al instanciar el Ahorcado dentro de un if, (si se pulsa el boton "jugar") no puedo usar mas tarde los metodos de ese objeto en cuestion. aqui os dejo el codigo:
Código Java:
Ver original
  1. public void actionPerformed(ActionEvent e) {
  2.         Object jugar=e.getSource();
  3.         if(jugar==botonJugar){//si se pulsa el boton 'jugar' se crea una nueva instancia del objeto con el numero de letras deseado
  4.             System.out.println("Se ha pulsado jugar");
  5.             int numLetras=Integer.parseInt(JOptionPane.showInputDialog("Elija numero de letras: "));
  6.             try {
  7.                 Ahorcado a1=new Ahorcado(numLetras);//se crea la palabra del ahorcado de la lista con las palabras que tienen el numero de letras que se pasa
  8.                 a1.setPalabra(a1.getPalabra());
  9.                 System.out.println(a1.getRespuesta());
  10.                 respuestaGr.setText(a1.getRespuesta());
  11.                 botonJugar.setEnabled(false);
  12.             } catch (NumberFormatException e1) {
  13.                 e1.printStackTrace();
  14.             } catch (IOException e1) {
  15.                 // TODO Auto-generated catch block
  16.                 e1.printStackTrace();
  17.             }
  18.         }else{//si no se pulsa el boton 'jugar' (se pulsa una letra) se utiliza el metodo tirar con esa letra
  19.             System.out.println("Se ha pulsado "+e.getActionCommand()+" para comenzar a adivinar la palabra");
  20.                 char letraElegida=e.getActionCommand().charAt(0);
  21.                 //System.out.println("LETRA: "+letraElegida); LO HACE BIEN
  22.                 try{
  23.                     a1.tirar(letraElegida);//da nullPointerException, a1 no existe ya que se crea dentro del if...
  24.                     respuestaGr.setText(a1.getRespuesta());//para actualizar la respuesta con cada tirada
  25.                     if(a1.completo()==false){
  26.                         JOptionPane.showMessageDialog(null,"Se acabaron tus vidas. Palabra: "+a1.getPalabra(),"Mensaje",JOptionPane.ERROR_MESSAGE);
  27.                         //Se completa la respuestaGr(respuesta grafica con la palabra) y se modifica el xml añadiendo 1 al atributo 'aciertos' de esa palabra suponiendo que exista, si no se hace
  28.                         try{
  29.                             SAXBuilder builder=new SAXBuilder();
  30.                             org.jdom2.Document doc=builder.build("palabras.xml");
  31.                             Element raiz=doc.getRootElement();
  32.                            
  33.                         }catch(JDOMException j){
  34.                             j.printStackTrace();
  35.                         } catch (IOException e1) {
  36.                             // TODO Auto-generated catch block
  37.                             e1.printStackTrace();
  38.                         }
  39.                     }else{
  40.                         JOptionPane.showMessageDialog(null,"Enhorabuena. Palabra: "+a1.getPalabra()+ "acertada","Mensaje",JOptionPane.ERROR_MESSAGE);
  41.                        
  42.                     }
  43.                 }catch(NullPointerException nul){
  44.                     nul.printStackTrace();
  45.                 }
  46.         }
  47.     }
  #6 (permalink)  
Antiguo 28/04/2014, 12:35
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Errror NullPointer Exeception

Estás haciendo el new de a1 = new Ahorcado.... dentro del if, por lo que en la parte del else no está definido (si entra en el if, no entra en el else), por lo que a1.tirar() da nullpointer al ser a1 un null.

Haz el new fuera del if

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 28/04/2014, 15:53
 
Fecha de Ingreso: abril-2014
Mensajes: 2
Antigüedad: 10 años
Puntos: 0
Respuesta: Errror NullPointer Exeception

Gracias por contestar, pero es que ahi esta el problema, el new se debe crear si se cumple la condicion (en este caso el pulsar el boton 'jugar') asi que no se como solucionarlo.
  #8 (permalink)  
Antiguo 28/04/2014, 21:46
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Errror NullPointer Exeception

Estás haciendo Ahorcado a1=new Ahorcado() por lo que incluso a1 es una variable local dentro del if. En cuanto salgas del if se pierde (no el new, sino la variable en si misma). Como la estás usando en el else y no te da error al compilar, imgino que tienes otro a1 declarado fuera. Puede ser exactamente el mismo problema que le comenté a lutxi con tener dos variables mapa declaradas, solo que en tu caso es a1.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 29/04/2014, 01:33
 
Fecha de Ingreso: diciembre-2007
Mensajes: 24
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Errror NullPointer Exeception

Hola...

Siguiendo con mi problema de instancias... no se donde no he instanciado ahora mismo...

Ya que en la clase Mapa tengo...

public class Mapa
{
int sizeCuadrado=20;
int sizeCirculo=5;
int posX=10;
int posY=20;
int [][] mapa;
Código:
    public Mapa()
    {
       
   int  [][] mapa={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,2,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,2,0},{0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0},{0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0},{0,1,0,1,0,0,1,0,0,3,3,0,0,1,0,0,1,0,1,0},{0,1,1,1,1,1,1,0,3,3,3,3,0,1,1,1,1,1,1,0},{0,1,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0},{0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0},{0,1,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0},{0,2,1,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,2,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};

    }

public int getMap(int fila, int columna)
 {
              
        return mapa[fila][columna];
 }
}
Y en la clase tablero...


Código:
public void rellenar()
    {
       
               for (int i=0; i<11; i++)
            {
                for (int j=0; j<20; j++)
                {     mapa[i][j]=plano.getMap(i,j);

                        System.out.print(mapa[i][j]);
                }
            }
    }
Pero el nullpointer me da en getMapa... si el metodo pone que devuelve un int, y recibe dos int ... ¿Dónde está el error?
  #10 (permalink)  
Antiguo 29/04/2014, 11:16
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Errror NullPointer Exeception

El problema, como te comenté antes, es que tienes declaradas dos variables mapa distitnas. Si pones int [][] antes de la variable la estás declarando, pones int [][] delante de mapa en dos sitios, así que tienes dos variables distintas con el mismo nombre mapa.

Código Java:
Ver original
  1. public class Mapa {
  2.  
  3.     public int [][] mapa;  // Esta es una variable mapa, que está sin inicializar
  4.  
  5.     public Mapa()
  6.     {
  7.           int[][] mapa = .... ; // esta es la otra variable mapa que sí inicializas.
  8.     }

Estás incializando la variable que declaras dentro del constructor, así que terminado el constructor, pierdes la variable, ya que lo que declaras dentro de un método (constructor) se pierde al salir de él, es una variable local al método. Si accedes a mapa fuera del constructor, estás accediendo a la otra variable mapa, la que no has inicializado y que es un atributo de la clase (la has declarado fuera de los métodos) y está accesible y sin inicializar en todos los demás sitios.

Tienes que NO declarar la variable por segunda vez, pare ello, simplemente quita el int [][]

Código Java:
Ver original
  1. public class Mapa {
  2.  
  3.     public int [][] mapa;  // Esta es una variable mapa, que está sin inicializar
  4.  
  5.     public Mapa()
  6.     {
  7.           mapa = new .... ; // Aquí la inicializamos, porque NO la estamos declarando de nuevas.
  8.     }
Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: clase, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:17.