Ciao a tutti, sono un principiante di java. Avviando il programma mi da il seguente errore:
Exception in thread "main"
java.lang.NullPointerException
at anagrafe.Anagrafe.primo(Anagrafe.java:42)
at Principale.main(Principale.java:31)

Questo è il codice delle classi.
Principale.java
codice:
import anagrafe.Anagrafe;

/**
 * Classe con un main di esempio.
 */
public class Principale {

    /**
     * Esempio di uso della classe Anagrafe
     * Puo' essere utilizzato come semplice "test"
     * 
     */
    public static void main(String[] args) {
        
        // Quando si crea un oggetto Anagrafe si deve fornire il nome del comune 
        Anagrafe a = new Anagrafe("Torino");
        
        //...che e' poi accessibile tramite il metodo getComune().
        String nomeComune = a.getComune();
        System.out.println("Creata anagrafe per il comune di " + nomeComune);
        
        // L'aggiunta di un nuovo residente avviene 
        // tramite il metodo iscrivi() che riceve tre parametri
        // stringa: nome, cognome, e indirizzo
        a.iscrivi("Mario","Rossi","Via Roma 84");
        a.iscrivi("Giovanni","Verdi","Largo Milano 123");
        a.iscrivi("Giuseppe","Bianchi","Piazza Napoli 219");
        
        // Per accedere al primo residente si utilizza 
        // il metodo primo()
        String primoResidente = a.primo();
        System.out.println("primo() --> " + primoResidente);

        // Per accedere ad un residente qualsiasi dell'anagrafe 
        // si utilizza il metodo residente() che riceve come parametro 
        // il numero d'ordine del residente (a partire da 1, 
        // percio' primo() == residente(1));
        primoResidente = a.residente(1); 
        System.out.println("residente(1) --> " + primoResidente);
        System.out.println("residente(2) --> " + a.residente(2));
        System.out.println("residente(3) --> " + a.residente(3));
        
        // Il metodo elenco() restituisce una stringa con 
        // l'elenco dei residenti dell'anagrafe, uno per riga 
        // (ogni riga termina con ';', l'ultima con '.')
        System.out.println("Elenco: " + a.elenco());
        
        // Il metodo cerca() restituisce la stringa 
        // corrispondente al primo residente che contiene il 
        // parametro nel nome, nel cognome oppure nell'indirizzo
        System.out.println("Ricerca 'Milano': " + a.cerca("Milano"));
    }
}
Anagrafe.java

codice:
package anagrafe;

public class Anagrafe {
    
     String nomeAnagrafe;
    private Residente residenti[];
    
    static final int MAX = 20;
    int i;

    // Inserire tutti gli attributi necessari
    // Eventualmente creare altre classi
    
  /**
   * Crea una nuova anagrafe per il comune specificato
   */
  public Anagrafe(String comune) {
      nomeAnagrafe=comune;
      residenti = new Residente[MAX];
      i=0;
      
  }

  /**
   * Aggiunge un nuovo residente all'anagrafe
   */  
  public void iscrivi(String nome, String cognome, String indirizzo){
      
      Residente r = new Residente();
      r.nome=nome;
      r.cognome=cognome;
      r.indirizzo=indirizzo;
      
      residenti[i]=r;
      i++;
  }

  /**
   * Restituisce il primo residente
   */  
  public String primo() {
      return residenti[i].nome + " " + residenti[i].cognome + " " + residenti[i].indirizzo;
  }

  /**
   * Restituisce il nome del comune
   */
  public String getComune() {
    return nomeAnagrafe;
  }

  /**
   * Restituisce il residente i-esimo iscritto all'anagrafe
   */
  public String residente(int i) {
      return residenti[i-1].nome + " " + residenti[i-1].cognome + " " + residenti[i-1].indirizzo;
  }

  /**
   * Restituisce una stringa con l'elenco dei residenti,
   * ciascuno su una riga diversa
   * Ogni riga termina con ';', l'ultima con '.'
   */
  public String elenco() {
        String result = "(";
          for(int i=0; i<residenti.length; ++i){
              if(residenti[i] == null) break;
              if(i>0) result+=", ";
              result += residente(i+1);
          }
          result += ")";
          return result;
  }

  /**
   * Restituisce la stringa con il primo residente che
   * contiene il parametro daCercare all'interno del nome,
   * del cognome o dell'indirizzo
   */
  public String cerca(String daCercare) {
      return null;
  }

}
Residente.java
codice:
package anagrafe;

public class Residente {
    
    String nome;
    String cognome;
    String indirizzo;

}
Sapete dirmi cosa sbaglio? Grazie