3

Ich bin neu in Java und ich versuche, einen Scanner zu verwenden, um einige Daten aus einer Textdatei einzulesen. Der Scanner liest die String- und Integer-Datenelemente fein ein, aber wenn er ein Double erreicht, löst er eine InputMismatchException aus.(Java) Scanner liest nicht in nextDouble() aus Datei

Das Format der Textdatei sieht wie folgt aus ...

Nachname, Vorname, 0,0.0
Smith, John, 10,2.456
Jones, William, 15,3.568

Hier mein Code ...

import java.io.FileNotFoundException; 
import java.util.Scanner; 
import java.io.File; 

public class Student { 

    int age; 
    double gpa; 
    String firstName; 
    String lastName; 

    public static void main (String[] args) { 
     int iNum = 0; 
     double dNum = 0.0; 
     String str1 = ""; 
     String str2 = ""; 
     List<Student> listOfObjects = new ArrayList<>(); 

     try { 
      Scanner src = new Scanner(new 
        File("data.txt")).useDelimiter(",|\r\n|\n"); 

      while (src.hasNext()) { 
       str1 = src.next(); //last name 
       str2 = src.next(); //first name 
       iNum = src.nextInt(); //age 
       dNum = src.nextDouble(); /* gpa - having trouble reading these doubles with Scanner */    

       Student object = new Student(str1, str2, iNum, dNum); 
       listOfObjects.add(object); //add new object to list 

      } 
     } 
     catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     for (Student a: listOfObjects) // printing the sorted list 
      System.out.print(a.getStudentLastName() + ", " + 
      a.getStudentFirstName() + 
      ", " + a.getStudentAge() + ", " + a.getStudentGpa() + "\n"); 
    } 

    public Student(String str1, String str2, int iNum, double dNum){ 
     this.lastName = str1; 
     this.firstName = str2; 
     this.age = iNum; 
     this.gpa = dNum; 
    } 

    public String getStudentFirstName() { 
     return firstName; 
    } 

    public String getStudentLastName() { 
     return lastName; 
    } 

    public int getStudentAge() { 
     return age; 
    } 

    public double getStudentGpa() { 
     return gpa; 
    } 

ich habe versucht, das Gebietsschema US Einstellung und versucht, mit den Trennzeichen durcheinander, aber nichts scheint zu funktionieren.

+0

@TimBiegeleisen Ich hat versucht Aufruf src.nextLine() nach dem Aufruf von src.nextDouble(), aber der Fehler wird immer noch geworfen. Ich habe auch versucht, es als String und Parsing zu verdoppeln, aber der gleiche Fehler tritt auf. –

+0

Also das nächste Element war kein Doppel. – EJP

Antwort

0

Vielen Dank an @Sotirios für das Ausrufen meines falschen Schließens der Frage. Ihr Problem wird durch Verwendung eines falschen Musters in Ihrem Scanner verursacht. Basierend auf dem Snippet der Eingabedatei, die Sie uns gezeigt haben, gibt es Leerzeichen nach jedem Komma. Daher sollten Sie das folgende Muster dies widerzuspiegeln werden:

,\\s*|\r\n|\n 
^^^^^ match a comma, followed by zero or more spaces 

Als ich vor Ort getestet, habe ich nicht einmal bis zum double Wert bekommen, stürzte es, wenn die dritte Position integer zu lesen. Versuchen Sie, den folgenden Code:

Scanner src = new Scanner(new File("data.txt")).useDelimiter(",\\s*|\r\n|\n"); 
while (src.hasNext()) { 
    str1 = src.next(); 
    str2 = src.next(); 
    iNum = src.nextInt(); 
    dNum = src.nextDouble(); 

    Student object = new Student(str1, str2, iNum, dNum); 
    listOfObjects.add(object); //add new object to list 
} 

Der Grund, warum die ersten beiden Saiten wurden durch immer ist, dass der Raum nach wurde das Komma nach oben in die nächste Saite gerollt. Aber Sie kommen nicht mit Zahlen davon, in diesem Fall hatten die zusätzlichen Leerzeichen keinen Platz und Sie landeten mit der InputMismatchException Sie sah weiter.

+0

Entschuldigung, ich habe den Beitrag aktualisiert, um zu zeigen, dass hinter den Kommas keine Leerzeichen stehen. Das war ein Tippfehler meinerseits. Ich habe dieses Muster immer noch versucht, ohne Erfolg. –

+0

Dann kann ich Ihr Problem nicht lokal reproduzieren. Sie sollten daran arbeiten, Ihr Problem reproduzierbar zu machen, damit andere versuchen können, es zu lösen. –

+0

Wie viele Zeilen können Sie lesen, oder können Sie nicht einmal eine komplette Zeile lesen? –

0

Ich löste das Problem. Das Delimiter-Muster, das ich verwendete, sah so aus (", | \ r \ n | \ n"). Der Scanner sah also kein Double, sondern fügte ihn in den String mit dem Nachnamen ein, der durch einen Wagenrücklauf getrennt wurde.

Die einfache Lösung dafür war, einen Wagenrücklauf in das Muster aufzunehmen.

Das neue Muster sieht wie folgt aus - ("| \ r \ n | \ n | \ r")

Verwandte Themen