PDA

View Full Version : Problema NullPointerException


Snakethesniper
24-01-2010, 13:31
Ciao a tutti, sto sviluppando un programma in Java, la compilazione va bene ma al momento dell'esecuzione mi segnala un errore NullPointerException.
Il programma è formato da 3 classi :
public abstract class Persona{
String nome,cognome;
int matricola;
//costruttore
public Persona(){
nome="";
cognome="";
matricola=0;
}

//metodi
public void ordina(Persona[] p){
int i;
for(i=0;i<p.length;i++){
if(p[i].matricola<p[i+1].matricola){
Persona d=p[i];
p[i]=p[i+1];
p[i+1]=d;
}
}
}
public String toString(){
return nome + " " + cognome + " " + matricola;
}
}
public class Dirigente extends Persona{
double perc;
public Dirigente(){
super();
perc=0.0;
}

}

public class Impiegato extends Persona{
double tasso;
public Impiegato(){
super();
tasso=0.0;
}
}

Il programma è
import java.lang.*;
import java.io.*;
import java.util.*;

public class Soluzione4{
public static void main(String[] args) throws IOException{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Persona[] p = new Persona[10];
String input;
String d = "D";
String c = "I";
int i=0;
while((input=in.readLine()) != null){
StringTokenizer str = new StringTokenizer(input,",");
String token = str.nextToken();
i+=1;
if(token.equals(d)){

Dirigente dir = new Dirigente();
dir.nome = str.nextToken();
dir.cognome = str.nextToken();
dir.matricola = Integer.parseInt(str.nextToken());
dir.perc= Double.parseDouble(str.nextToken());
p[i]=dir;
}
if(token.equals(c)){
Impiegato imp = new Impiegato();
imp.nome = str.nextToken();
imp.cognome = str.nextToken();
imp.matricola = Integer.parseInt(str.nextToken());
imp.tasso= Double.parseDouble(str.nextToken());
p[i]=imp;
}
}

for(Persona per : p){
System.out.println(per.toString());
}
}
}
Il problema mi viene segnalato alla riga System.out.println(per.toString());
Per terminare la sequenza di input inserisco il carattere ^Z (nel cmd di windows), credo sia dovuto a quello ma non capisco come risolverlo.

Mixmar
24-01-2010, 13:46
Il problema mi viene segnalato alla riga System.out.println(per.toString());
Per terminare la sequenza di input inserisco il carattere ^Z (nel cmd di windows), credo sia dovuto a quello ma non capisco come risolverlo.

Se pre-allochi l'array "p" perchè contenga 10 elementi, e poi ne introduci meno di 10, prima o poi l'ultimo loop assegnerà a "per" un valore nullo, da cui l'errore. Inoltre, nel tuo codice non vedo controlli che verifichino l'altra condizione, cioè il caso in cui tu introduca più di 10 elementi, che ti riporterebbe una "ArrayIndexOutOfBoundException".

Per ovviare a questo, potresti utilizzare una lista dinamica al posto dell'array statico, per esempio ArrayList (http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html), che cresce a seconda delle necessità.

Inoltre, ti consiglierei di usare la classe Scanner (http://java.sun.com/javase/6/docs/api/java/util/Scanner.html) al posto di BufferedReader per leggere dallo standard input.

Snakethesniper
24-01-2010, 14:08
Se pre-allochi l'array "p" perchè contenga 10 elementi, e poi ne introduci meno di 10, prima o poi l'ultimo loop assegnerà a "per" un valore nullo, da cui l'errore. Inoltre, nel tuo codice non vedo controlli che verifichino l'altra condizione, cioè il caso in cui tu introduca più di 10 elementi, che ti riporterebbe una "ArrayIndexOutOfBoundException".

Per ovviare a questo, potresti utilizzare una lista dinamica al posto dell'array statico, per esempio ArrayList (http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html), che cresce a seconda delle necessità.

Inoltre, ti consiglierei di usare la classe Scanner (http://java.sun.com/javase/6/docs/api/java/util/Scanner.html) al posto di BufferedReader per leggere dallo standard input.
Essendo un'esercitazione sono costretto ad usare in BufferedReader, per quanto riguarda l'array penso che cmq c'entri anche il simbolo di fine input perchè anche ridimensionando l'array a 1 o 2 valori e inserendo esattamente quelli mi compare lo stesso errore

PGI-Bis
24-01-2010, 14:22
Quando capita un'eccezione la JVM sputa classi, metodi e righe per aiutarti ad individuare il punto nel codice in cui si è verificato il problema. E' un grosso aiuto.

Comunque a me pare che p[0] sia sempre null e quindi l'eccezione dovrebbe capitarti nel System.out.println(per.toString()).

khelidan1980
24-01-2010, 15:02
incapsulamento....spero che tu non sia ancora arivato a studiarlo!!! :D

Snakethesniper
24-01-2010, 19:16
Quando capita un'eccezione la JVM sputa classi, metodi e righe per aiutarti ad individuare il punto nel codice in cui si è verificato il problema. E' un grosso aiuto.

Comunque a me pare che p[0] sia sempre null e quindi l'eccezione dovrebbe capitarti nel System.out.println(per.toString()).
Si hai ragione, ci stavo proprio pensando oggi e ho risolto mettendo il +1 all'interno degli if, in modo che lo 0 venga riempito, nell'ultimo ciclo for alla fine ho messo un controllo che se è null fa un break e ora funziona tutto! Grazie