Ho un problema con questa classe Libretto che si trova a questa pagina:
http://homes.dico.unimi.it/~capra/provaSet08/

mi dice in esecuzione che alla riga 217 il tostring

Exception in thread main java.lang.NullPointerException
at Libretto.toString(Libretto.java:215)
at java.lang.String.valueOf(unknown Source)
at java.lang.Strinf.Builder.append(Unknown Source)
at TestLibretto.main(TestLibretto.java:26)



import java.util.*;
import java.io.*;

class Libretto{


// campi
private String nome;
private String cognome;
private String cdl;
private int matricola;
private int n_esami;

private Esame [] Libretto;

// costruttore


public Libretto ( String nome, String cognome, String cdl, int matricola, int n_esami) {

this.nome = nome;
this.cognome = cognome;
this.cdl = cdl;
this.matricola = matricola;
this.n_esami = n_esami;

Libretto = new Esame[n_esami];


}


//metodi


public boolean aggiunge (Esame nuovo) {


if(nuovo == null || nuovo.cdl() != this.cdl() || nuovo.cdl() == null || this.cdl() == null || this.quanti() == n_esami )
return false;


if( (quanti() -1)== n_esami)
return false;


Libretto [this.quanti()] = nuovo; // inserisci nuovo esame

return true;

}


public Esame cancella () {

int a = 0;

if(Libretto == null)
return null;

a = this.quanti()-1;
Libretto [this.quanti()-1] = null; // cancella esame nella precedente posizione

return Libretto[a];

}



public String cdl () {

return cdl;

}

public String cognome (){

return cognome;

}

public Date data (Esame e){

int a = 0;
if( e == null || this.cdl() != e.cdl())
return null;

for (int i = 0; i <this.quanti() -1; i++){

if( Libretto[i].equals(e) )
a = i;


}
return Libretto[a].data();

}

public int esamiPrimaDi(Date data){


int n = 0; //contatore

if (Libretto == null || data == null)
return 0;


for (int i = 0; i <this.quanti() -1; i++){

if(Libretto[i].data().before(data) ){ // controllo le date minori di data

n++;


}


}
return n; // ritorni il numero di esami sostenuti prima di quella data
}



public int matricola (){

return matricola;

}


public Double media (){

int cont = 0;
int somma = 0;
double media = 0;
for (int i = 0; i < this.quanti() - 1; i++){
somma = somma + Libretto[i].voto(); // ...sommo i voti
media = (double) (somma/(i+1)); //fa la media
}

return media;
}


public String nome (){

return nome;

}


public int quanti (){

int i = 0;

for (i = 0; i <n_esami; i++){ // esamino il libretto

if (Libretto[i] == null){ // Se arrivi a null fermati

break;
}

}


return i+1; // ritorna esami registrati
}


public Esame sostenuto (String corso){ //mezzo giusto

int a = 0;

if(corso == null || this.cdl() == null)
return null;

for(int i = 0;i<this.quanti();i++){

if (Libretto[i].corso() == corso) // controllo che i corsi siano identici
a = i;
}
return Libretto[a]; // ritorna il riferimento

}


public Esame ultimo(){

Date data = new Date();
int a = 0;

if (Libretto == null)
return null;

for (int i = 1; i <this.quanti()-1; i++){ //i =1 per confrontare con il precedente

if(Libretto[i].data().after(Libretto[i-1].data()) ){ //controllo la data più recente

if (data.after(Libretto[i].data())) // confronta la data maggiora tra le 2 con la data maggiore in precedenza
data = Libretto[i].data(); // inserimento in data della data più recente
a = i;
// esame con data più recente
}
}
return Libretto[a];

}


public String toString(){

String s = " ";
if (Libretto == null)
return s;

for (int i = 0; i <=this.quanti()-1; i++){
s = s + Libretto[i].toString();

}
return s;

}

}//fine classe