Originariamente inviato da fleeaaa
per maggiore chiarezza :
ff chiama la classe dove c'è la finestra di dialogo(al suo interno ci sono textfield e button salva)
mm è la classe che contiene il model, cioè tutti i metodi.
Secondo me il punto è qui. ff potrebbe essere nullo (ma non lo sapremo mai perchè il codice che hai postato non è sufficiente a capirlo).

Alcune considerazioni:

1) Tieni separati i vari wrapper di scrittura su file
2) Il trattamento delle eccezioni, fallo tutto nel metodo di salvataggio
3) Usa la clausola finally per evitare di lasciare aperti i file in caso di eccezioni
4) Usa il metodo flush() per assicurarti che la scrittura venga effettivamente fatta.

Qui sotto è come dovrebbero essere fatte le cose per avere maggiori garanzie di corretta scrittura:

codice:
PrintStream ps = null;
FileOutputStream fos = null;
try {
   fos = new FileOutputStream("prenota.txt");
   ps = new PrintStream( fos );

   ps.println(ff.getMatr().getText()+","ff.getPass().getText()+","ff.getfo().getItemListener();
   ps.flush();
} catch (Exception e) {
   e.printStackTrace();
} finally {
   if (ps != null) {
      try { ps.close(); } catch (Exception e) { }
   } else {
      if (fos != null) {
         try { fos.close(); } catch (Exception e) { }
      }
   }
}
I due oggetti (PrintStream e FileOutputStream) vengono creati separatamente, così hai un maggiore controllo nell'eventuale caso di eccezione in crerazione di uno dei due.
All'interno del blocco try viene fatta la scrittura e il flush. La chiusura degli stream viene relegata al blocco finally, così essa viene garantita anche in caso di eccezione.

PS: usa i tag CODE per il codice, come ho fatto io per mantenere indentazione e formattazione.