PDA

View Full Version : [JAVA] Qualcuno sa spiegarmi questo errore in fase di compilazione?


Jim Fox
02-10-2008, 20:44
Come alcuni di voi sapranno, da poche settimane mi sono avvicinato alla programmazione ed a JAVA.
Ed ammetto di trovare qualche difficolta a capire tutti gli errori che mi capitano senza nessuno che me li spieghi.

Il libro che sto seguendo, mi ha chiesto come esercizio, di costruire un programma "Letter" che come risultato mostri un testo, come questo:

Ciao destinatario:
riga vuota
prima riga del contenuto della lettera
seconda riga del contenuto della lettera
riga vuota
Saluti,
riga vuota
mittente

E di utilizzare il metodo concat per costruire una stringa più lunga a partire da due stringhe più corte ed utlizzare la stringa speciale \n per andare a capo.

Vi anticipo che alla fine sono riuscito a far funzionare il programma, ma ci ho messo parecchio per capire il seguente errore in fase di compilazione:
Exception in thread "main" java.lang.NullPointerException
at Letter.<init>(Letter.java:19)
at LetterTester.main(LetterTester.java:13)


Alla fine ho capito che il problema stava nella dichiarazione della variabile:
private String testo;
che invece doveva essere dichiarata:
private String testo = "";

E' forse perchè in quel modo ho assegnato un valore nullo a testo? Qualcuno sa spiegarmi x bene il motivo? :D

ps: vi inserisco la parte del programma incriminata:

public class Letter {
private String mittente;
private String destinatario;
private String testo = "";

/* costruisco una lettera con nome mittente e destinatario */
public Letter(String from, String to) {
mittente = from;
destinatario = to;
testo = testo.concat("Ciao ").concat(destinatario).concat(":").concat("\n").concat("\n");
}

/* aggiungo una riga */
public void addLine(String line) {
testo = testo.concat(line).concat("\n");
}

/* restituisce il testo della lettera */
public String getText() {
testo = testo.concat("Saluti, ").concat("\n").concat("\n").concat(mittente);
return testo;
}
}

andbin
02-10-2008, 21:31
E' forse perchè in quel modo ho assegnato un valore nullo a testo? Qualcuno sa spiegarmi x bene il motivo? :D Quando viene istanziato un oggetto, tutte le variabili di istanza vengono innanzitutto subito inizializzate al valore di "default" (0 per valori numerici, false per boolean, null per i reference).
Se poi la variabile di istanza ha una inizializzazione esplicita, allora verrà fatto l'assegnamento appena dopo che il costruttore della super-classe è stato eseguito.

ps: vi inserisco la parte del programma incriminata:Il codice è corretto, anche se:

a) La variabile di istanza 'destinatario' la usi solo nel costruttore. Quindi potevi anche non definire tale variabile di istanza.

b) Potevi anche non inizializzare testo = "", bastava fare nel costruttore:
testo = "Ciao ".concat(destinatario).concat...........


P.S.: Se ti è stato chiesto di mettere solamente "\n", va bene, non sto a discutere. Sappi comunque che la sequenza di newline dipende dalla piattaforma e quella corretta per la piattaforma la si può ricavare da una property di sistema (getProperty() di System).

Jim Fox
03-10-2008, 00:00
a) La variabile di istanza 'destinatario' la usi solo nel costruttore. Quindi potevi anche non definire tale variabile di istanza.
E' vero grazie... Ho appena verificato il corretto funzionamento anche senza tale variabile. :)


b) Potevi anche non inizializzare testo = "", bastava fare nel costruttore:
testo = "Ciao ".concat(destinatario).concat...........
Grazie mille anche in questo caso. Provato e tutto ok! ;)


P.S.: Se ti è stato chiesto di mettere solamente "\n", va bene, non sto a discutere. Sappi comunque che la sequenza di newline dipende dalla piattaforma e quella corretta per la piattaforma la si può ricavare da una property di sistema (getProperty() di System).
Si si, mi è stato chiesto di mettere soltanto \n, anche perché sto seguendo fedelmente il libro di Cay Horstmann "Concetti di informatica e Fondamenti di Java" e stando ancora ai primi capitoli, i concetti sono molto semplici. Pensa che è la prima volta che incontro \n, ed ora so il suo funzionamento. :)