sencilla duda con .NullPointerException ,

Iniciado por manolazo, 15 Enero 2013, 22:10 PM

0 Miembros y 1 Visitante están viendo este tema.

manolazo

Buenas tardes.

Soy  novato en esto de java pero hay un concepto que no entiendo en el siguiente código.


public class ClaseA {
   
    public int x[];       
    public ClaseB c;
   
    public ClaseA (){       
        x = new int[2];       
        for (int i=0; i<x.length; ++i){
            x[i]= i;
        }           
        c= new ClaseB(x[1]);   
        mostrar();   
    }   
   
    public void mostrar(){       
        c.calcu();
       c.mostrarenClase();             
       System.out.println(c.a );     
       
    }
   
    public static void main (String args[]){     
        ClaseA p = new ClaseA();
       
    }   
}




public class ClaseB {
    public int a;
    public ClaseA p ;
   
    public ClaseB(int x){
        this.a= x;         
    }
   
    public void calcu(){
        a++;       
    }
   
    public void mostrarenClase(){       
        System.out.println(p.x[1]);
    }         
}


Creo un objeto de la claseB , y cuando llamo el metodo mostrarenClase() es cuando me sale el NUllPointerException.

Supongo es porque en la claseB no creo un objeto de la claseA y por eso en la declaracion de variable de la claseB : ClaseA p; no esta inicializado y al llamar a p.x[1] me sale el error .

Se ve que hay algun concepto que no tengo claro.

Como se soluciona?

Un saludo y gracias de antemano.

juancaa

Tu error esta en la Clase B, tu problema es que claramente estas haciendo un print de un objeto de Clase A al cual en tu codigo tu llamas p y no lo estas inicializando, la solucion seria esta:

ClaseA:
Código (java) [Seleccionar]
public class ClaseA {
   
    public int x[];       
    public ClaseB c;
   
    public ClaseA (){       
        x = new int[2];       
        for (int i=0; i<x.length; ++i){
            x[i]= i;
        }           
        c= new ClaseB(x[1], this);   
        mostrar();   
    }   
   
    public void mostrar(){       
        c.calcu();
       c.mostrarenClase();             
       System.out.println(c.a );     
       
    }
   
    public static void main (String args[]){     
        ClaseA p = new ClaseA();
       
    }   
}


Clase B:
Código (java) [Seleccionar]
public class ClaseB {
    public int a;
    public ClaseA p ;
   
    public ClaseB(int x, ClaseA p){
        this.a= x;         
        this.p = p;
    }
   
    public void calcu(){
        a++;       
    }
   
    public void mostrarenClase(){       
        System.out.println(p.x[1]);
    }         
}


Es decir, en el momento en que tu mandas que se muestre p.x[1] estando dentro de la Clase B estas haciendo referencia a un atributo de la Clase A por tanto para poder mostrar ese atributo debes antes haber inicializado la variable cosa que haces en las lineas 7, 8, 9 tu problema esta en que para poder mostrar este atributo la Clase A debes poder acceder a la Clase A, la forma de hacerlo es pasando la Clase A en el momento en que creas la Clase B (linea 11) y la forma de pasarla es pasandose a ella misma, por eso el "this", con esto todo el contenido "public" de la Clase A sera accesible por tu Clase B.

Espero haberme explicado...  :xD
Que tengas un buen dia!

manolazo

Hola.

La única forma que venia era hacer una instancia de la claseA , pero claro eso complica las cosas porque se vuelve a formar otro objeto de la claseB y asi siempre lanzandose un StackOverFlow error.

Muchisimas gracias por la aclaración ya que simplifique el código de una parte mas grande que me tenia comida la cabeza en algo tan sencillo. Está claro que todavía me falta mucho por aprender.

Lo dicho muchas gracias por tomarte el interés de ayudarme. Buen foro.