Assegnare un elemento di un array di oggetti a un reference

di il
6 risposte

Assegnare un elemento di un array di oggetti a un reference

Salve,
con questo codice, eseguendo la classe main che richiama questo metodo su un oggetto, mi da un errore a runtime.
Il seguente:
Exception in thread "main" java.lang.NullPointerException
at Gara.CorriGara(Gara.java:59)
at TestGara.main(TestGara.java:6)
Se serve pubblico anche le altre classi.
Grazie in anticipo!

Sorgente:

public void CorriGara()
	{
		int rand= (int) Math.random()*4;
		Auto vincente = griglia[rand];
		vincente.dammiDettagli();
	}

6 Risposte

  • Re: Assegnare un elemento di un array di oggetti a un reference

    Probabilmente griglia[rand] è null. Assicurati che punti ad un oggetto di tipo Auto diverso da null.
  • Re: Assegnare un elemento di un array di oggetti a un reference

    Pubblico la classe Gara che contiene il metodo CorriGara(), la classe main che crea un oggetto di tipo Gara, e invoca il metodo CorriGara();
    Nel costruttore della classe Gara viene invocato il metodo creaGrigliaDiPartenza() che al suo interno crea degli oggetti di tipo Auto e li assegna all'array di Auto.

    
    public class Gara
    {
    	private String nome;
    	private String risultato;
    	private Auto griglia[] ;	
    	public void setNome(String nome)
    	{
    		this.nome=nome;
    	}
    	
    	public String getNome()
    	{
    		return this.nome;
    	}
    	
    	public void setRisultato(String vincitore)
    	{
    		this.risultato = "Il vincitore di "+this.getNome()+" :\n"+vincitore;
    	}
    	
    	public String getRisultato() {
    		return this.risultato;
    	}
    
    	public Gara(String nome)
    	{
    		this.setNome(nome);
    		this.setRisultato("Corsa non terminata");
    		creaGrigliaDiPartenza();
    	}
    
    	public void creaGrigliaDiPartenza()
    	{
    		Pilota uno = new Pilota("Luca");
    		Pilota due = new Pilota("Daniela");
    		Pilota tre = new Pilota("Martina");
    		Pilota quattro = new Pilota("Alessia");
    
    		Auto autoNumeroUno = new Auto("Ferrari",uno);
    		Auto autoNumeroDue = new Auto("Mercedes", due);
    		Auto autoNumeroTre = new Auto("Redbull",tre);
    		Auto autoNumeroQuattro = new Auto("Renault",quattro);
    		
    		Auto griglia[] = new Auto[4];
    		griglia[0] = autoNumeroUno;
    		griglia[1] = autoNumeroDue;
    		griglia[2] = autoNumeroTre;
    		griglia[3] = autoNumeroQuattro;
    	}
    	
    	
    
    	public void CorriGara()
    	{
    		int rand= (int) Math.random()*4;
    		Auto vincente = griglia[rand];
    		vincente.dammiDettagli();
    	}
    
    
    
    	}
    	
    	public class TestGara
    {
    	public static void main(String[] args) {
    					
    		Gara imola = new Gara("GP di Imola");
    		imola.CorriGara();
    		String risultato = imola.getRisultato();
    		System.out.println(risultato);
    		
    	}
    }
    
  • Re: Assegnare un elemento di un array di oggetti a un reference

    Innanzitutto questo:

    int rand= (int) Math.random()*4;

    scritto così non va bene. Il cast ha maggior precedenza rispetto alla moltiplicazione. Quindi prima invoca random(), poi fa il cast. Ma il cast tronca i decimali e siccome il valore è tra 0 e 0,999999.... (mai 1) ottieni sempre 0. E 0 moltiplicato per 4 ... di nuovo ZERO.

    Va riscritto così:

    int rand= (int) (Math.random()*4);


    Riguardo l'altro problema: in creaGrigliaDiPartenza() hai definito una variabile LOCALE chiamata griglia. Quindi stai assegnando l'array a questa variabile locale e NON alla variabile di istanza, che quindi resta a null. Semplicemente: assegna alla variabile di istanza e non definirne una locale!


    P.S. abituati a mettere le [] vicino al tipo e non a destra della variabile:

    private Auto griglia[]; // No
    private Auto[] griglia; // Sì
  • Re: Assegnare un elemento di un array di oggetti a un reference

    Innanzitutto grazie per la risposta.
    Ho fatto le modifiche da lei dettate:
    Ho eliminato l'array locale nell metodo(frutto di vari tentativi), ho aggiustato anche la dichiarazione dell'array di istanza e il generatore di numeri casuali.
    Ma purtroppo non va ancora.

    Exception in thread "main" java.lang.NullPointerException
    at Gara.creaGrigliaDiPartenza(Gara.java:46)
    at Gara.<init>(Gara.java:31)
    at TestGara.main(TestGara.java:5)
    import java.lang.Math;
    
    public class Gara
    {
    	private String nome;
    	private String risultato;
    	private Auto[] griglia ;	
    	public void setNome(String nome)
    	{
    		this.nome=nome;
    	}
    	
    	public String getNome()
    	{
    		return this.nome;
    	}
    	
    	public void setRisultato(String vincitore)
    	{
    		this.risultato = "Il vincitore di "+this.getNome()+" :\n"+vincitore;
    	}
    	
    	public String getRisultato() {
    		return this.risultato;
    	}
    
    	public Gara(String nome)
    	{
    		this.setNome(nome);
    		this.setRisultato("Corsa non terminata");
    		creaGrigliaDiPartenza();
    	}
    
    	public void creaGrigliaDiPartenza()
    	{
    		Pilota uno = new Pilota("Luca");
    		Pilota due = new Pilota("Daniela");
    		Pilota tre = new Pilota("Martina");
    		Pilota quattro = new Pilota("Alessia");
    
    		Auto autoNumeroUno = new Auto("Ferrari",uno);
    		Auto autoNumeroDue = new Auto("Mercedes", due);
    		Auto autoNumeroTre = new Auto("Redbull",tre);
    		Auto autoNumeroQuattro = new Auto("Renault",quattro);
    		
    		griglia[0] = autoNumeroUno;
    		griglia[1] = autoNumeroDue;
    		griglia[2] = autoNumeroTre;
    		griglia[3] = autoNumeroQuattro;
    	}
    	
    	
    
    	public void CorriGara()
    	{
    		int rand= (int) (Math.random()*4);
    		Auto vincente = griglia[rand];
    		vincente.dammiDettagli();
    	}
    
    
    
    	}
  • Re: Assegnare un elemento di un array di oggetti a un reference

    L'array griglia è ancora null quando cerchi di accedergli per assegnargli le auto.
    Nel metodo creaGrigliaDiPartenza, prima di griglia[0]=..., per inizializzare l'array, aggiungi l'istruzione
    griglia=new Auto[4];
  • Re: Assegnare un elemento di un array di oggetti a un reference

    Grazie tante, ho risolto. Siete stati gentilissimi!
Devi accedere o registrarti per scrivere nel forum
6 risposte