2017-03-27 4 views
1

Ich habe ein Programm mit einer Menge von JTextAreas, die vom Benutzer gefüllt werden. Ich speichere diese Kommentare mit einem BufferedWriter in einer .txt-Datei, getrennt durch ein Semikolon.Java NoSuchElementException mit Scanner auf leere Zeilen

Ich versuche, den Inhalt dieser .txt-Datei wieder in das Programm zu lesen, wo die Probleme beginnen. Ich benutze einen Scanner, um die Datei zu lesen, was perfekt für die ersten TextAreas funktioniert. Bei einem anderen Satz von JTextAreas schlägt es jedoch fehl, wenn nur Leerzeichen oder nichts in der Sicherungsdatei vorhanden sind. Ich verstehe nicht, warum es nur ein paar Zeilen vorher funktioniert.

openItem.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     JFileChooser oi = new JFileChooser(); 
     oi.showOpenDialog(null); 
     Scanner scan = null; 
     try{ 
     scan = new Scanner(oi.getSelectedFile()); 
     scan.useDelimiter(Pattern.compile(";")); 
     String[] input = new String[144]; 
     for (int i = 1; i<9;i++){ //This works fine, even with empty JTextAreas 
       input[i] = scan.next(); 
      } 
      f1.setText(input[1]); 
      f2.setText(input[2]); 
      f3.setText(input[3]); 
      f4.setText(input[4]); 
      f5.setText(input[5]); 
      f6.setText(input[6]); 
      f7.setText(input[7]); 
      f8.setText(input[8]); 
     for(int i=1;i<13;i++){ //This throws a NoSuchElementException if it's reading a savefile with empty TextAreas 
       input[i] = scan.next(); 
      } 
      c1.setText(input[1]); 
      c2.setText(input[2]); 
      c3.setText(input[3]); 
      c4.setText(input[4]); 
      .... 
      }catch(IOException | NoSuchElementException i){ 
       JOptionPane.showMessageDialog(null, "Error while reading", "Error",1); 
      }}}); 

Nun ist die zweite for-Schleife perfekt funktioniert, wenn die Sicherungsdatei einen Wert für jede JTextArea enthält, aber nicht, wenn es für eines der Elemente nur Leerzeichen ist. Was mache ich hier falsch?

Antwort

0

Es scheint, wenn die Eingabezeichenfolge nicht die genaue Höhe der Eingänge hat Sie scan.next() Aufruf werden, aber es wird nicht jedes Element sein, um zurückzukehren, wie Sie aus dem documentation wirft es ein NoSuchElementException sehen kann.

public String nächste()

Finds und gibt die nächsten vollständigen Token von diesem Scanner. Ein vollständiges Token wird von einer Eingabe vorangestellt und gefolgt von einer Eingabe, die dem Delimiter-Muster entspricht. Diese Methode blockiert möglicherweise während des Wartens auf Eingabe auf Scan, auch wenn ein vorheriger Aufruf von hasNext() True zurückgegeben hat.

Wirft: NoSuchElementException - wenn keine weiteren Token Illegal verfügbar sind - wenn dieser Scanner

geschlossen

Um dies zu beheben fügen Sie einen Scheck, um zu sehen, ob es ein Token sonst hinzufügen leeren String, wenn kein Token . Sie können dies mit einem ternären Operator wie diesem tun

for(int i=1;i<13;i++){ //This throws a NoSuchElementException if it's reading a savefile with empty TextAreas 
     input[i] = (scan.hasNext())? scan.next(): ""; 
      } 
      c1.setText(input[1]); 
      c2.setText(input[2]); 
      c3.setText(input[3]); 
      c4.setText(input[4]); 
+0

Vielen Dank, das funktioniert! Nur zur Klarstellung: Was macht die Linie? Ich habe noch nie eine solche Syntax gesehen, aber es sieht wie eine if-Anweisung aus. – Lotec

+0

@Lotec ja, es heißt ternärer Operator. Im Grunde genommen setzt man in den Klammern eine Bedingung wie eine if-Anweisung ohne das if. und wenn es wahr ist, wird der erste Wert zurückgegeben, andernfalls das Recht. Ähnlich wie sonst. –