Problema vettore di oggetto con Java

di il
8 risposte

Problema vettore di oggetto con Java

Buongiorno a tutti;
Premesso che sono un neofita di java;
Premesso che non so neanche se quello che sto per chiedervi sia possibile;
Allora, volevo appunto verificare la possibilità(e in caso sia possibile il funzionamento) di un vettore di oggetti in java.
Per farlo ho creato un semplice codice, composto da una classe con l'unico scopo di fare una somma tra 2 numeri random(questo per verificare se la somma cambia per ogni vettore) e un main che riprende il metodo somma della classe e lo assegna a un vettore.
Vi allego il codice per maggiore chiarezza:

CLASSE:

import java.util.Random;
public class classe {

	int somma=0;
	int n=0;
	int n1=0;
	Random random=new Random();
	public classe(int somma,int n,int n1)
	{
		this.somma=somma;
		this.n=n;
		this.n1=n1;
	}
	public int sommal()
	{
		n=random.nextInt(10);
		n1=random.nextInt(20);
		somma=n+n1;
		return somma;
	}	
}
MAIN:

import java.util.*;
public class Main {
	public static void main(String[]args)
	
	
	{
		
		int vet[]= new int[4];
		classe[] prova=new classe[4];		
vet[0]=prova[0].sommal();
vet[1]=prova[1].sommal();
vet[2]=prova[2].sommal();
	
System.out.println("\n"+vet[0]+"\n"+vet[1]+"\n"+vet[2]+"");
	}
}
Ovviamente mi da errore;
Nello specifico:
Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:22)



spero possiate aiutarmi a fare luce.. Vi ringrazio

8 Risposte

  • Re: Problema vettore di oggetto con Java

    Anonimamente22 ha scritto:


    
    		classe[] prova=new classe[4];		
    vet[0]=prova[0].sommal();
    vet[1]=prova[1].sommal();
    vet[2]=prova[2].sommal();
    
    Ovviamente mi da errore;
    Nello specifico:
    Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:22)
    La questione è semplice (ed è da sapere): quando si istanzia un array con es. new classe[4] si crea soltanto l'array in sé, NON anche gli oggetti contenuti. All'inizio il tuo array contiene i 4 elementi con valore null (=nessun oggetto referenziato).
    Sei tu che devi creare gli oggetti ed assegnarli negli elementi dell'array, prima di fare qualunque altra cosa con l'array stesso.
  • Re: Problema vettore di oggetto con Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    
    		classe[] prova=new classe[4];		
    vet[0]=prova[0].sommal();
    vet[1]=prova[1].sommal();
    vet[2]=prova[2].sommal();
    
    Ovviamente mi da errore;
    Nello specifico:
    Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:22)
    La questione è semplice (ed è da sapere): quando si istanzia un array con es. new classe[4] si crea soltanto l'array in sé, NON anche gli oggetti contenuti. All'inizio il tuo array contiene i 4 elementi con valore null (=nessun oggetto referenziato).
    Sei tu che devi creare gli oggetti ed assegnarli negli elementi dell'array, prima di fare qualunque altra cosa con l'array stesso.
    Ho capito cosa hai scritto e ti ringrazio! però tra capire e il fare c'è di mezzo un abisso. Perdona l'ignoranza di una persona che ancora sta scoprendo la programmazione a oggetti:
    Come posso mettere in pratica ciò che hai detto attenendomi al mio codice?
  • Re: Problema vettore di oggetto con Java

    Anonimamente22 ha scritto:


    Come posso mettere in pratica ciò che hai detto attenendomi al mio codice?
    Devi creare ciascun oggetto di tipo classe ed assegnarlo nell'elemento dell'array. Sai certamente come istanziare una classe (l'hai fatto con Random, ad esempio).
    Bene, crea più oggetti di quel tuo tipo classe ed assegnali nell'array.

    prova[0] = new ........
    prova[1] = new ........
    ...
  • Re: Problema vettore di oggetto con Java

    Cosi'?

    
    import java.util.*;
    
    public class Main {
    
    	
    	
    	public static void main(String[]args)
    	
    	
    	{
    		
    		int vet[]= new int[4];
    		classe[] prova=new classe[4];
    			
    vet[0]=new prova[0].sommal();
    vet[1]=new prova[1].sommal();
    vet[2]=new prova[2].sommal();
    		
    		
    System.out.println("\n"+vet[0]+"\n"+vet[1]+"\n"+vet[2]+"");
    
    
    	}
    }
    
    Non parte neanche facendo cosi'...
  • Re: Problema vettore di oggetto con Java

    Anonimamente22 ha scritto:


    	
    		int vet[]= new int[4];
    		classe[] prova=new classe[4];
    			
    vet[0]=new prova[0].sommal();
    vet[1]=new prova[1].sommal();
    vet[2]=new prova[2].sommal();
    
    No, completamente sbagliato.

    Ascolta: la tua classe "classe" ha 1 solo costruttore, quello che hai scritto tu:

    public classe(int somma,int n,int n1)

    Quindi devi invocare questo costruttore e passargli questi 3 argomenti (che ovviamente devi sapere tu cosa farci)

    new classe( ...... )

    questa espressione la assegni a ciascuno degli elementi in prova. Poi dopo (ripeto DOPO), puoi usare gli elementi di prova per invocare quel sommal() .
  • Re: Problema vettore di oggetto con Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    	
    		int vet[]= new int[4];
    		classe[] prova=new classe[4];
    			
    vet[0]=new prova[0].sommal();
    vet[1]=new prova[1].sommal();
    vet[2]=new prova[2].sommal();
    
    No, completamente sbagliato.

    Ascolta: la tua classe "classe" ha 1 solo costruttore, quello che hai scritto tu:

    public classe(int somma,int n,int n1)

    Quindi devi invocare questo costruttore e passargli questi 3 argomenti (che ovviamente devi sapere tu cosa farci)

    new classe( ...... )

    questa espressione la assegni a ciascuno degli elementi in prova. Poi dopo (ripeto DOPO), puoi usare gli elementi di prova per invocare quel sommal() .
    Ma se facessi cosi' sarebbe un solo oggetto.
    Io avrei bisogno che per quel metodo "sommal" ci siano differenti dati.
    cioè nel senso
    invoco sommal 0 e ci sono dei dati
    invoco sommal 1 e ce ne sono altri
    e cosi' via.
    insomma come se fosse un vettore...
    Poi chiare che per creare l'oggetto nel main normale devo passargli i parametri del costruttore.
    Ma come detto all'inizio a me interessava di più considerare quella classe nel main come un vettore. Con ogni cella contenente dati diversi.
  • Re: Problema vettore di oggetto con Java

    Anonimamente22 ha scritto:


    Ma se facessi cosi' sarebbe un solo oggetto.
    Ma come detto all'inizio a me interessava di più considerare quella classe nel main come un vettore. Con ogni cella contenente dati diversi.
    Ma io non ho detto che devi creare un (UNO) solo oggetto della tua classe. Se hai fatto un new classe[4] hai un array di 4 elementi. E ho già detto prima che per ciascun elemento dell'array devi creare un oggetto della tua classe.

    Quindi

    prova[0] = new classe( ...... );
    prova[1] = new classe( ...... );
    ....


    E già che ci sono ti faccio notare che la tua classe ha delle cose senza senso.
    Il costrutore ha 3 parametri

    public classe(int somma,int n,int n1)

    Questi parametri li assegni correttamente ai campi:

    this.somma=somma;
    this.n=n;
    this.n1=n1;

    Ma poi NON li usi, perché in sommal() assegni alle variabili di istanza "altro":

    n=random.nextInt(10);
    n1=random.nextInt(20);
    somma=n+n1;

    Quindi a COSA ti serve passare quei 3 argomenti al costruttore??

    Devi RAGIONARE, è questo che serve in ambito programmazione.
  • Re: Problema vettore di oggetto con Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    Ma se facessi cosi' sarebbe un solo oggetto.
    Ma come detto all'inizio a me interessava di più considerare quella classe nel main come un vettore. Con ogni cella contenente dati diversi.
    Ma io non ho detto che devi creare un (UNO) solo oggetto della tua classe. Se hai fatto un new classe[4] hai un array di 4 elementi. E ho già detto prima che per ciascun elemento dell'array devi creare un oggetto della tua classe.

    Quindi

    prova[0] = new classe( ...... );
    prova[1] = new classe( ...... );
    ....


    E già che ci sono ti faccio notare che la tua classe ha delle cose senza senso.
    Il costrutore ha 3 parametri

    public classe(int somma,int n,int n1)

    Questi parametri li assegni correttamente ai campi:

    this.somma=somma;
    this.n=n;
    this.n1=n1;

    Ma poi NON li usi, perché in sommal() assegni alle variabili di istanza "altro":

    n=random.nextInt(10);
    n1=random.nextInt(20);
    somma=n+n1;

    Quindi a COSA ti serve passare quei 3 argomenti al costruttore??

    Devi RAGIONARE, è questo che serve in ambito programmazione.
    Provato velocemente e tutto funziona. Ti ringrazio tantissimo, dopo proverò con calma e spero che in caso di altri problemi possa contare su di te

    Per quanto riguarda ciò che hai detto sul metodo costruttore; più che un problema di ragionamento è un problema di conoscenze il mio xD.
    Da quello che ho capito tu mi stai dicendo:
    Avresti potuto lasciare il metodo costruttore vuoto visto che assegni tutto nel metodo. Però ancora non mi è chiaro il concetto di metodo costruttore in sé. Ho giusto comprato un libro di java oggi e spero possa aiutarmi nel mio studio auto-imposto
Devi accedere o registrarti per scrivere nel forum
8 risposte