Telefonino.net network
 
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. NEI PREFERITI .:: | RSS Forum | RSS News | NEWS web | NEWS software |
| PUBBLICITA' | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | CERCA nel FORUM » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 18-07-2005, 01.07.30   #1
GiulioCesare
Senior Member
 
L'avatar di GiulioCesare
 
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
GiulioCesare promette bene
[Java] Eccezione array di oggetti

Salve ragazzi ho un problema con un piccolo programma, che eredita una
classe e deve memorizzare delle informazioni tramite input, ma vengono
segnalati degli errori in esecuzione, appena dopo inserisco il primo nome,
l'errore è questo

Exception in thread "main" java.lang.NullPointerException
at studenti.<init>(studenti.java:24)
at studenti.main(studenti.java:42)

E questo è il codice, grazie a chi vorrÃ_ aiutarmi

Codice:
import javax.swing.*;
import java.util.*;

class dati
{
        public String nome="";
        public String cognome="";
        public int eta=0;
}

public class studenti extends dati
{
        public studenti [] n = new studenti [5];

        studenti()
        {
                for(int i=0; i<=4; i++)
                {
                        String t = JOptionPane.showInputDialog("Inserire nome");
                        n[i].nome = t;
                        String z = JOptionPane.showInputDialog("Inserire cognome");
                        n[i].cognome = z;
                        String y = JOptionPane.showInputDialog("Inserire etÃ_");
                        n[i].eta = Integer.parseInt(y);
                }
        }

        public void mostra()
        {
                for(int i=0; i<=4; i++)
                {
                        System.out.println (n[i].nome);
                        System.out.println (n[i].cognome);
                        System.out.println (n[i].eta);

                }
        }

        public static void main(String [] args)
        {

                studenti a = new studenti();
                a.mostra();
                System.exit(0);

        }

}
GiulioCesare non è collegato   Rispondi citando
Vecchio 18-07-2005, 01.20.03   #2
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Ok, la variabile posta a null è la y letta nel parseInt; evidentemente per qualche motivo è null: controlla il valore di y prima di darla in pasto a parseInt.

Tra l'altro, una cosa proprio di base... nella classe studenti hai questo attributo:

public studenti [] n = new studenti [5];


sicuro sia una buona scelta?
Tra l'altro ti va bene perchè è semplicemente un contenitore di studenti, se fosse stato tipo

public studenti n = new studenti();

avresti avuto una StackOverflowException, poichè la costruzione di un oggetti di tipo studenti richiamava a sua volta la creazione di un altro oggetto dello stesso tipo.

Dav82 non è collegato   Rispondi citando
Vecchio 18-07-2005, 10.41.51   #3
GiulioCesare
Senior Member
 
L'avatar di GiulioCesare
 
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
GiulioCesare promette bene
Le variabili sono a posto, invece l'errore che mi viene dato in esecuzione dopo aver inserito il primo nome è proprio quello di StackOverflowException
Sono nuovo del java e questa cosa di inizializzare l'array non l'ho ancora capita, perchè dopo aver allocato memoria per l'array, devo anche inizializzare ogni sua posizione?
GiulioCesare non è collegato   Rispondi citando
Vecchio 18-07-2005, 11.21.46   #4
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
L'array è semplicemente il contenitore, come ben sai dal C immagino. Se poi l'array contiene non integer, che sono un tipo primitivo, ma degli oggetti... se utilizzi gli elementi dell'array bisogna seguire le regole per gli oggetti.. ovvero inizializzarli prima dell'uso
Creando l'array crei semplicemente dei "puntatori" a degli oggetti, che vanno creati (o che sono già creati nell'uso del programma... ma prima o poi devono essere stati creati se si vuole usarli).


Se chiami un qualsiasi metodo o leggi un qualsiasi valore di un oggetto non inizializzato otterrai una NullPointerException, poichè l'oggetto a cui ti riferisci è ancora NULL.


Per la StackOverFlowException funziona così: tu hai nella classe studenti 1 attributo di tipo studenti, così quando crei un'istanza dell'oggetto studenti, questo creerà anche l'attributo, che è ancora di tipo studenti, e quindi bisogna creare un altro oggetto di tipo studenti, che però avrà il suo attributo di tipo studenti, e allora un altro oggetto studenti... così all'infinito, o meglio fino a che la memoria è piena: a quel punto parte l'eccezione.

In sostanza una struttura del genere è da evitare

Prova a pensare ad una soluzione: se te la dico già io ti perdi metà del gusto
Dav82 non è collegato   Rispondi citando
Vecchio 18-07-2005, 21.58.55   #5
GiulioCesare
Senior Member
 
L'avatar di GiulioCesare
 
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
GiulioCesare promette bene
Sono riuscito a farlo funzionare, soprattutto modificando il costruttore studenti e quello della classe dati. Tu parlavi prima del C, io vengo dal C++ ed ho provato ad eseguire lo stesso mio codice in C++ e funziona perfettamente, quindi deduco che in C++ non bisogna istanziare ogni volta ogni singolo elemento dell'array
GiulioCesare non è collegato   Rispondi citando
Vecchio 18-07-2005, 22.02.53   #6
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Sinceramente non lo so, però se non ricordo male in C/C++ lo spazio viene allocato contestualmente alla creazione del contenitore (e in locazioni di memoria attigue, tra l'altro), in base alla dimensione (sizeof) del tipo di dato di cui è costituito l'array. Penso che la differenza stia qui


Cmq Java è bello!
Dav82 non è collegato   Rispondi citando
Vecchio 18-07-2005, 22.17.48   #7
Thor
Il re di bastoni
Top Poster
 
L'avatar di Thor
 
Registrato: 26-04-2001
Loc.: Milàn
Messaggi: 23.413
Thor promette bene
Quota:
Originariamente inviato da Dav82
Prova a pensare ad una soluzione: se te la dico già io ti perdi metà del gusto
A questo punto la puoi anche confessare, la soluzione!
___________________________________

Un giorno in cui voleva fare il cattivo, Mister Coniglietto sbirciò oltre la siepe e vide che l'orto del Contadino Fred era pieno di lattuga fresca e verde; Mister Coniglietto, invece, non era pieno di lattuga per niente. E ciò gli parve un'ingiustizia.
Sono un Vampiro! I am a Vampire!
Thor non è collegato   Rispondi citando
Vecchio 18-07-2005, 22.27.16   #8
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Quota:
Originariamente inviato da Thor
A questo punto la puoi anche confessare, la soluzione!
Nu nu!
Fino a che non c'è la sua soluzione con il codice, niente suggerimenti
Dav82 non è collegato   Rispondi citando
Vecchio 18-07-2005, 23.07.26   #9
GiulioCesare
Senior Member
 
L'avatar di GiulioCesare
 
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
GiulioCesare promette bene
Ecco il mio codice, ditemi se posso modificare ancora qualcosa

Codice:
import javax.swing.*;
import java.util.*;

class dati
{
	public String nome="";
	public String cognome="";
	public int eta=0;

	 dati(String n, String c, int e)
	 {

        	nome=n;
        	cognome=c;
        	eta=e;
    	 }
}

public class studenti 
{
	public dati [] n = new dati [5];

	studenti()
	{
		for(int i=0; i<=4; i++)
		{

			String t = JOptionPane.showInputDialog("Inserire nome");
			String z = JOptionPane.showInputDialog("Inserire cognome");
			String y = JOptionPane.showInputDialog("Inserire età");
			int x = Integer.parseInt(y);
			n[i] = new dati(t, z, x);
		}
	}

	public void mostra()
	{
		for(int i=0; i<=4; i++)
		{
			System.out.println (n[i].nome);
			System.out.println (n[i].cognome);
			System.out.println (n[i].eta);

		}
	}

	public static void main(String [] args)
	{

		studenti a = new studenti();
		a.mostra();
		System.exit(0);

	}

}
GiulioCesare non è collegato   Rispondi citando
Vecchio 18-07-2005, 23.31.49   #10
Dav82
Gold Member
Top Poster
 
Registrato: 18-07-2002
Messaggi: 6.399
Dav82 promette bene
Così direi che va bene
L'unica cosa è mettere visibilità private e non public all'array


Io poi, ma è una questione puramente stilistica, visto che è un esercizio per imparare, scinderei le operazioni di costruzione dell'oggetto e di inserimento dei dati, ovvero nel costruttore non farei nulla e quello che attualmente è nel costruttore lo mettere in un metodo inserimento()... ma ripeto, è una questione stilistica

Un ultimo appunto (sono rompipalle ).. anche qui dal punto di vista stilistico... io odio quell'indenting! Io lo faccio così:

Codice:
public int metodoFuffa(String nome){
   //linea vuota che altrimenti non si capisce un tubo
   int variabileAppggio = 0; //qui le variabili di servizio
   //linea vuota per separare variabili e corpo del metodo
   istruzione1
   ...
   istruzioneM
   //altra linea vuota per separare corpo e valore di return
   return variabileAppoggio;
}
Ma io sono un po' tanto pignolo eh
Dav82 non è collegato   Rispondi citando
Vecchio 18-07-2005, 23.41.03   #11
GiulioCesare
Senior Member
 
L'avatar di GiulioCesare
 
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
GiulioCesare promette bene
Per quanto riguarda la programmazione prendo con molta attenzione i tuoi consigli, visto che sono agli inizi con il java, ma per quanto riguarda l'indentazione, odio chi apre la parentesi graffa nella stessa riga del nome del metodo, proprio come fai tu
GiulioCesare non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
[FLEX] Accedere elementi array. Fast-M Programmazione 0 18-01-2006 12.07.44
[Java] Eccezione NullPointerException GiulioCesare Programmazione 0 31-08-2005 22.47.45
[Java] Eliminare doppioni in un array Alhazred Programmazione 7 22-02-2005 12.17.12
[java] DavideDave Programmazione 2 18-11-2004 09.32.45
[VB.NET] - Accodare degli array realtebo Programmazione 3 30-10-2004 13.53.35

Orario GMT +2. Ora sono le: 03.37.46.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.