Newsgroup: it.comp.os.linux.development
Titolo: Java Gestione stringhe

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, premetto che uso la
Mandrake 9.1 e come compilatore uso la java version "1.4.2_03"
code:
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);
        }
}
-- 
ICQ # 84624356
MSN 
lello...@katamail.com
Yahoo ilpuntatore


Ciao,
premetto che odio java e che secondo me è una farsa bella e buona, un 
sistema veloce per far fare soldi alle ditte produttrici di software (è 
una mia opinione eh non voglio discutere con nessuno), detto questo, 
poichè l'ho dovuto usare a volte, mi pare che l'errore sia nella mancata 
inizializzazione del vettore di riferimenti
public studenti [] n = new studenti [5];
//hai un vettore con 5 puntatori a oggetti inizializzati
n[1] = new studenti(); // in realtà anche il costruttore ha poco senso 
per come l'hai fatto te mi pare, cmq è per farti capire
PS: prendi tutto quello che ti ho scritto con beneficio del dubbio :-)
bye, AM

Alberto wrote:

Cosa intendi per inizializzazione del vettore di riferimenti, come devo
inizializzarlo?




In questo modo te hai allocato in memoria uno spazio per contenere 5 
riferimenti a oggetti di tipo studente ok?
Ma hai solo i riferimenti, gli oggetti non sono creati n[i] non punta a 
niente è un riferimento a NULL
for(i=0; i<5; i++) n[i] = new studenti();
adesso i riferimenti sono inizializzati
ti consiglierei di rifare il costruttore di studenti anche, secondo me 
così non ha molto senso. Sposta il vettore al di fuori della classe 
studenti, ad esempio in una classe test, stessa cosa per il main
bye, AM

 bye, AM
Se inizializzo ogni elemento dell'array come dici tu, mi viene segnalato un
erore di StackOverflowException , perchè? :-(



Posta il codice

 Posta il codice
Ho risolto in questa maniera:
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);
        }
}
-- 



Uhm....senti non tene offendere eh, è vero che l'ereditarietà è uno dei 
punti di forza dei linguaggi OO, però mica va usata per forza!!! Nel tuo 
caso poi non ha veramente alcun tipo di senso visto che dichiari gli 
attributi della classe dati addirittura pubblici; cmq anche se fossero 
privati, l'ereditarietà si usa principalmente per poter sfruttare il 
polimorfismo e in questo caso uno studente non è assolutamente un dato, 
ti pare? Se vuoi fare due classi separate ti conviene mettere in 
studenti un riferimento a un oggetto dati e non ereditare un bel 
niente!! Poichè presumo sia un qualcosa per la scuola, se porti al 
professore del codice così credo che gli venga un infarto :-)
Bye bye, AM

Alberto wrote:

Infatti nell'ultime codice che ho postato, faccio proprio così, comunque che
ovviamente era solo un esercizio per avvicinarmi al java, provengo dal C++
, e mi sto accorgendo sempre più che il C++ ha davvero poco di linguaggio
ad oggetti :-(


 attributi della classe dati addirittura pubblici;
Non potrebbe fare storcere il naso ad un purista (getter/setter?), ma
che va benissimo per aggregrare in maniera logica dei dati quando non
c'e` necessita` particolare di incapsulamento e/o protezione.
Luca
-- 
Home: 
http://kronoz.cjb.net
"Ricorda sempre che sei unico, esattamente come tutti gli altri".

 ad oggetti :-(
Scusa, su cosa basi l'affermazione che ho quotato?
-- 
[ Andrea Spadaccini - a.k.a. Lupino/Lupin85 - Catania - ICQ#: 91528290 ]
[ GPG ID: 5D41ABF0 - key @ 
pgp.mit.edu
 - Slackware 10.1 w/Linux 2.4.22 ]
[ Linux User # 313388 - MAIL: a.spadaccini(at)catania(dot)linux(dot)it ]

 Luca
No! E' assolutamente sbagliata, a livello concettuale in primis ed anche 
a livello di ottimizzazione! La potenza dell'OO ha senso se la si sa 
sfruttare, altrimenti  è brutta da vedere ed una complicazione per il 
compilatore; ereditarietà = binding dinamico !!!
Bye, Alberto