Foro de elhacker.net

Programación => Java => Mensaje iniciado por: manolazo en 15 Enero 2013, 22:10 pm



Título: sencilla duda con .NullPointerException ,
Publicado por: manolazo en 15 Enero 2013, 22:10 pm
Buenas tardes.

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

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


Código:
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.


Título: Re: sencilla duda con .NullPointerException ,
Publicado por: juancaa en 16 Enero 2013, 03:21 am
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
  1. public class ClaseA {
  2.  
  3.    public int x[];        
  4.    public ClaseB c;
  5.  
  6.    public ClaseA (){        
  7.        x = new int[2];        
  8.        for (int i=0; i<x.length; ++i){
  9.            x[i]= i;
  10.        }            
  11.        c= new ClaseB(x[1], this);  
  12.        mostrar();    
  13.    }    
  14.  
  15.    public void mostrar(){        
  16.        c.calcu();
  17.       c.mostrarenClase();              
  18.       System.out.println(c.a );    
  19.  
  20.    }
  21.  
  22.    public static void main (String args[]){      
  23.        ClaseA p = new ClaseA();
  24.  
  25.    }    
  26. }

Clase B:
Código
  1. public class ClaseB {
  2.    public int a;
  3.    public ClaseA p ;
  4.  
  5.    public ClaseB(int x, ClaseA p){
  6.        this.a= x;          
  7.        this.p = p;
  8.    }
  9.  
  10.    public void calcu(){
  11.        a++;        
  12.    }
  13.  
  14.    public void mostrarenClase(){        
  15.        System.out.println(p.x[1]);
  16.    }          
  17. }

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


Título: Re: sencilla duda con .NullPointerException ,
Publicado por: manolazo en 16 Enero 2013, 12:24 pm
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.