2016-10-27 10 views
1

Ich mache eine AP CS-Zuweisung und eine der Anweisungen wollte ich jede Spalte von Daten in meiner Textdatei in 1 separaten eindimensionalen Arrays lesen. Ich konnte es bis jetzt nicht herausfinden und konnte Rat/Hilfe gebrauchen. Wenn ich versuche, das Programm auszuführen, erhalte ich auch den Fehler „java.util.InputMismatchException null (in java.util.Scanner)Eingabe-Mismatch-Fehler in Java

1980 Aug 945 100 Allen 
1983 Aug 962 100 Alicia 
1984 Sep 949 100 Diana 
1985 Jul 1002 65 Bob 
1985 Aug 987 80 Danny 
1985 Sep 959 100 Elena 

oben ist die Textdatei und unten ist der Code, den ich zur Zeit bin mit.

+0

Auf welche Codezeile bezieht sich der Fehler? –

Antwort

1

Jede Zeile Ihrer Datei enthält 5 Elemente, aber Ihr Code liest nur die ersten 4. Wenn es also denkt, dass es die nächste Zeile beginnt, versucht es tatsächlich, das letzte Element der aktuellen Zeile zu lesen Dies ist nicht ein int.

Eine Lösung wäre, das fünfte Element jeder Zeile zu lesen, auch wenn Sie keine Speicherorte haben.

+0

Yeah ive dachte darüber nach, warum es nicht lesen würde, und ich dachte, dass es wegen der Tatsache sein könnte, dass es das nächste nach dem int "1980" zu einer Schnur liest. Aber was ich herausfinden möchte, ist, wie man die Spalten liest, damit es nicht auf der a-Schnur weitergeht. Also für das Jahr würde es nur 1980, 1983 usw. lesen. – Shenshi

1

an den Eingangsdaten Werfen Sie einen Blick

1980 Aug 945 100 Allen 
1983 Aug 962 100 Alicia 
1984 Sep 949 100 Diana 

Und was Sie greifen:

 while (inFile.hasNext()) 
     { 
      year[n] = inFile.nextInt(); 
      month[n] = inFile.next(); 
      pressure[n] = inFile.nextInt(); 
      windSpeed[n] = inFile.nextInt(); 
      System.out.println (year[n] + "\n"); 
      n++; 
     } 

Es gibt 5 Felder in der Eingabe, und Sie greifen nur 4. Wenn es Durchläuft es das zweite Mal, erwartet es, Jahr (int) zu packen und stattdessen den Namen (String) zu übernehmen.

1

Sie wählen nicht die letzte Spalte in der while Schleife. In der zweiten Schleife versucht der Scanner die 5. Spalte als int zu lesen. Sie müssen inFile.next() am Ende der while Schleife hinzufügen, auch wenn Sie das Ergebnis nicht verwenden, so dass der Scanner nicht mit der nächsten Schleife verschoben wird.

0

Sie haben beide eine String und ein int so, entweder immer fragen Sie nach einem String (und analysieren es später zu einem int), oder, wenn Sie die formatation der Datei kennen, können Sie es zu Ihren Gunsten nutzen konnten. In Ihrem Beispiel haben Sie eine int, String, int, int, String, und dann einen Zeilenumbruch.

Von hier aus könnten Sie Dinge auf verschiedene Arten tun.

Eine Lösung die Verwendung eines Scanner impliziert eine ganze Zeile zu lesen, und dann die String ‚s Methode .split(String regex), erstellen wir eine Reihe von Strings, die wir jetzt analysieren kann. Damit die Methode funktioniert korrekt, müssen Sie konsequent in der Art sein, wie Sie Ihren Text trennen. In meinem Beispiel habe ich Tab verwendet. Ich habe deine Beispiele verwendet und sie alle tabbed. Ich werde hier nicht angezeigt, da der Editor die Tabs nicht speichert.

File fileName = new File("hurcdata2.txt"); 

int arrayLength = 6; //I used 6 since you showed 6 lines 
//You could use an ArrayList or an algorithm to dynamically 
//increase the size of the arrays. 
int [] year = new int[arrayLength]; 
String [] month = new String[arrayLength]; 
int [] pressure = new int[arrayLength]; 
int [] windSpeed = new int[arrayLength]; 

Scanner fileScanner = null; 
try { 
    fileScanner = new Scanner(fileName); 
} 
catch (FileNotFoundException ex) { 
    //Exception handling; 
} 


int n = 0; 
while(fileScanner.hasNext()) { 
    String toParse = fileScanner.nextLine(); 
    String[] splitedString = toParse.split("\t"); 

    year[n] = Integer.parseInt(splitedString[0]); 
    month[n] = splitedString[1]; 
    pressure[n] = Integer.parseInt(splitedString[2]); 
    windSpeed[n] = Integer.parseInt(splitedString[3]); 
    n++; 
} 
fileScanner.close(); 

//I will include my test to check it. 
for (int i = 0 ; i < arrayLength; i++) { 
    System.out.print("\ni: " + i); 
    System.out.print(" - year: " + year[i]); 
    System.out.print("; month: " + month[i]); 
    System.out.print("; pressure: " + pressure[i]); 
    System.out.println("; windSpeed: " + windSpeed[i]); 
} 

Eine andere Lösung ist es, eine StringReader statt .split(String regex); zu verwenden. StringReader ist wie ein Scanner, aber es ist in Strings spezialisiert.

Sie könnten auch eine FileReader in einem BufferedReader verpackt aus der Datei lesen.

FileReader myFileReader = null; 
BufferedReader myBufferedReader = null; 

try { 
    myFileReader = new FileReader(fileName); 
    myBufferedReader = new BufferedReader(myFileReader); 

    int n = 0; 
    String toParse = null; 
    while((toParse = myBufferedReader.readLine()) != null) { 
     //Is this confusing for you?^
     String[] splitedString = toParse.split("\t"); 

     year[n] = Integer.parseInt(splitedString[0]); 
     month[n] = splitedString[1]; 
     pressure[n] = Integer.parseInt(splitedString[2]); 
     windSpeed[n] = Integer.parseInt(splitedString[3]); 
     n++; 
    } 

} 
catch (FileNotFoundException ex) { 
    //Exception handling; 
} 
catch (IOException ex) { 
    //Exception handling; 
} 
finally { 
    try { 
     myFileReader.close(); 
    } 
    catch (IOException ex) { 
     //Exception handling; 
    } 

    try { 
     myBufferedReader.close(); 
    } 
    catch (IOException ex) { 
     //Exception handling; 
    }   
} 

Ich hoffe, ich habe geholfen.

Einen schönen Tag noch. :)