0

Es scheint ein Fehler beim Lesen einer Textdatei zu sein. Dieses Programm sollte eine Zeile lesen, das erste Zeichen überprüfen und den zugehörigen Code in der if-Anweisung ausführen. Das Programm läuft für die erste Zeile einwandfrei und gibt den Inhalt aus, es kann jedoch die nächste Zeile nicht verarbeiten. Hier ist der Code im mit:Warum gibt mein Programm einen Fehler beim Lesen von Datei?

public void importStart(){ 

    try { 
     FileReader fr = new FileReader("src/data.txt"); 
     BufferedReader reader = new BufferedReader(fr); 

     String line = reader.readLine(); 
     Scanner scan = null; 

      while(line != null){ 
       scan = new Scanner(line); 
       String string1 = scan.next(); 
       inputType = string1.charAt(0); 
       if(inputType == 'S'){ 
        foxCount = scan.nextInt(); 
        rabbitCount = scan.nextInt(); 
        dragonCount = scan.nextInt(); 
        System.out.println(inputType + " "+ foxCount + " "+ rabbitCount + " "+ dragonCount); 
       } 
       else if(inputType == 'X'){ 
        System.out.println("Test 1"); 
        animalType = string1.substring(2, 3); 
        System.out.println("Test 2"); 
         if(animalType == "F"){ 
          step = scan.nextInt(); 

         } 
         else if(animalType == "R"){ 
          step = scan.nextInt(); 
         } 
         else if(animalType == "D"){ 
          step = scan.nextInt(); 
         } 
        System.out.println(inputType + " "+ animalType + " " + step); 
       } 

      line = reader.readLine(); 

      } 
      reader.close(); 
     } 

und ich erhalte diesen Fehler

Hinweis, die erste Zeile ausgegeben ist, dass es sein soll, das ist, wie ich weiß, dass es richtig in der ersten Zeile betrieben hat. Die "Test 1" erscheint auch korrekt, was zu der Annahme führt, dass das Problem mit meiner string1-sstring-Implementierung zu tun hat. Ist das das Problem?

S 74 199 15 
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException:   String index out of range: 3 
Test 1 
at java.lang.String.substring(Unknown Source) 
at DataDisplayGui.importStart(DataDisplayGui.java:107) 
at DataDisplayGui.actionPerformed(DataDisplayGui.java:178) 
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 
at javax.swing.JComponent.processMouseEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.awt.EventQueue$4.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+0

Welche Linie diese Ausnahme auslöst? –

+0

Versuchen Sie einen Breakpoint in Zeile 107 zu setzen. String1 ist wahrscheinlich weniger als 2 Zeichen lang. –

Antwort

0
String string1 = scan.next(); 

scan.next() gibt Ihnen das nächste Token in der Zeile Variable, die nicht die ganze Linie sein könnte. Ersetzen Sie die fehlerhafte Teilzeichenfolge durch:

animalType = line.substring(2, 3); 
+0

Danke, das hat super funktioniert! – WazZ

0

Hängt davon ab, was sich in Ihrer src/data.txt-Datei befindet. Wenn die Zeile, die Sie ist zu lesen

X 

werden Sie diesen Fehler erhalten, weil die Aussage

string1.substring(2,3) 

versucht, einen Teil zurückzukehren, an Zeichen beginnend 2

Verwandte Themen