|
| 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 » | |
18-07-2005, 01.07.30 | #1 |
Senior Member
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
|
[Java] Eccezione array di oggetti
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); } } |
18-07-2005, 01.20.03 | #2 |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
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. |
18-07-2005, 10.41.51 | #3 |
Senior Member
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
|
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? |
18-07-2005, 11.21.46 | #4 |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
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 |
18-07-2005, 21.58.55 | #5 |
Senior Member
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
|
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
|
18-07-2005, 22.02.53 | #6 |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
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! |
18-07-2005, 22.17.48 | #7 | |
Il re di bastoni
Top Poster
Registrato: 26-04-2001
Loc.: Milàn
Messaggi: 23.413
|
Quota:
___________________________________
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! |
|
18-07-2005, 22.27.16 | #8 | |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
Quota:
Fino a che non c'è la sua soluzione con il codice, niente suggerimenti |
|
18-07-2005, 23.07.26 | #9 |
Senior Member
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
|
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); } } |
18-07-2005, 23.31.49 | #10 |
Gold Member
Top Poster
Registrato: 18-07-2002
Messaggi: 6.399
|
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; } |
18-07-2005, 23.41.03 | #11 |
Senior Member
Registrato: 02-04-2003
Loc.: Roma
Messaggi: 313
|
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
|
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
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 |