2013-06-19 3 views
2

J'essaie actuellement de lire un fichier de mon disque dur. Le nom de fichier est "Sample.txt", ci-dessous est mon code. Je suis en mesure de le faire pour compiler et exécuter, mais recevoir cette erreur:java.util.InputMismatchException Erreur de sortie

Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:909) 
at java.util.Scanner.next(Scanner.java:1530) 
at java.util.Scanner.nextDouble(Scanner.java:2456) 
at Proj1GradesService.errorReport(Proj1GradesService.java:42) 
at Proj1GradesClient.main(Proj1GradesClient.java:13) 

J'ai essayé de lire le fichier w/juste une boucle while et maintenant avec un try/catch, mais a reçu la même erreur , et je ne sais pas ce qui ne va vraiment pas avec ça. J'essaye de lire le fichier de la classe de service et ai l'appel à la méthode errorReport() de la classe de client. Toute aide serait grandement appréciée.

import java.util.*; //allows use of Scanner class 
import java.io.*; //for File and IOException classes 

class Proj1GradesService 
{ //begin Proj1GradesService 

    public void pageAndColHeading(char letter) //accepts char as a parameter 
    { //start pageAndColHeading 
    switch (letter) 
    { //start switch 
     case 'e': //write the caption for error report 
      System.out.println ("Error Report - Students With Invalid GPA"); //prints Error Report 
      break; 

     case 'v': //write the caption for valid report 
      System.out.println ("Valid Report - Students With Valid"); //prints Valid Report 
      break; 
     default: ; //do nothing 
    }//end switch 
    } //end pageAndColHeading 

    public void errorReport() throws IOException 
    { //start errorReport 

    Scanner scanFile = null; 
    try 
    { 
     scanFile = new Scanner (new File ("p1SampleGPAData.txt")); 
    } 
     catch (FileNotFoundException fnfe) 
     { 
      System.out.println ("wrong file name."); 
     } 

    String name; //name read from file 
    double gpa; //gpa read from file 
    int count = 0; //line # 

    while (scanFile.hasNext()) 
    { 
     name = scanFile.next(); 
     gpa = scanFile.nextDouble(); 
     System.out.println ("Line Number: " + count + "Name: " + name + "GPA: " + gpa); 

     ++count; 
    } //end while 
    scanFile.close(); 

    } //end errorReport 


} //end class 
+0

Pourriez-vous fournir un échantillon du fichier texte, afin que nous puissions voir quel format vous essayez d'analyser? –

Répondre

1

Compte tenu de votre structure de fichier ci-dessous qui est supposé de la déclaration d'impression

name1 1.1 
    name2 2.2 
    name3 3.3 

maintenant en fonction de votre code suivant la ligne

// consume your whole line. ie name1 1.1 
name = scanFile.next(); 
// looking for double but instead getting string ie name2 
// hence throwing InputMismatchException 
gpa = scanFile.nextDouble(); 

maintenant pour résoudre ci-dessus problème. Vous pouvez utiliser String.split().

// collect whole line 
    name = scanFile.next(); 

    // split by one or more whitespace OR use your delimiter 
    String[] str = name.split("\\s+"); 

    // gives name 
    String actName = str[0]; 

    // gives gpa, throws NumberFormatException if str[1] is not double value 
    double gpa = Double.parseDouble(str[1]); 

J'espère que cela aide. Si vous avez besoin d'aide, il suffit de demander.

+0

Merci pour votre aide. J'ai changé le code. Je n'ai pas non plus réalisé que le fichier avait 2 chaînes et 1 double à lire, prénom, nom et gpa. Donc, une partie de l'erreur d'incompatibilité est venue d'essayer de lire le nom de famille comme un double, alors j'ai corrigé cette partie aussi. –

0

En général, InputMismatchException est levée si la chose que vous essayez d'analyser ne correspond pas au format Scanner attend.

Dans ce cas, vérifiez votre fichier d'entrée pour voir si l'élément que vous analysez est double. Faites attention aussi à tout espace supplémentaire.

0

Il s'agit très probablement d'un problème de données qui ne correspondent pas aux attentes de votre programme. Vous devez revérifier la structure de votre fichier. Comme la pile montre nextDouble, le problème est un non-double dans le fichier où scanner attend un double.

0

Sans savoir à quoi ressemble votre fichier d'entrée, cette erreur se produit car vous essayez de lire les données de caractères dans un double, et ces caractères ne sont pas en double.

Assurez-vous que toutes les données que vous lisez sont dans le format que vous attendez.

Si c'était moi, je voudrais lire l'ensemble des données dans une chaîne, puis essayez de convertir ces chaînes en doubles, afin que je puisse entourer cette déclaration dans un try/catch et ensuite traiter de manière appropriée.

Questions connexes