2017-07-07 5 views
1

Je travaille actuellement avec la classe Java Scanner et j'obtiens une très étrange InputMismatchException. J'initialiser le scanner comme ceci:Java Scanner Lance InputMismatchException même lorsque le prochain jeton semble correspondre au type de données

Scanner in = new Scanner(new File(fileName)); 

in.useDelimiter("\n?.*:");

Quand j'appelle System.out.println(in.next());, il imprime 1500 à la ligne de commande, ce qui est la valeur correcte. Toutefois, si j'appelle System.out.println(in.nextInt());, le scanner lève une exception InputMismatchException. Je ne pense pas que j'imprime les nouvelles lignes ou les espaces vides, et je suis un peu perdu quant à la raison pour laquelle cela se produit.

EDIT: Voici le format de données pour ce que je lis dans:

Data Description:100 Next Data Description:200

EDIT: Appel Integer.parseInt(in.next()); résultats dans un NumberFormatException: For input string: "1"00.

+0

[Fonctionne pour moi] (http://ideone.com/bc7hyk). –

Répondre

1

Que InputMismatchException n'est pas étrange du tout, parce que votre regex n'est pas compatible multi-plateforme. Vous êtes probablement un utilisateur Windows, donc votre fichier texte aura \r\n comme fin de ligne, et pas seulement \n.

Ainsi le modèle approprié serait:

in.useDelimiter("\r?\n?.*:"); 

Pour accepter \r\n ou un seul \n.

Vous pouvez également essayer de travailler avec System.lineSeparator() pour soutenir différentes fins de ligne, mais vous devez conclure que, avec parenthese de sorte que le regex quantificateurs ? applique aux deux caractères \r\n pour les systèmes Windows:

in.useDelimiter(String.format("(%s)?.*:", System.lineSeparator())); 

Le problème avec cette approche est qu'il échoue lors de l'utilisation de Windows en tant que système d'exploitation, mais la réception du fichier d'un autre endroit, qui lui-même utilise seulement \n. Donc, je recommande la première approche.

+1

On peut utiliser '\ R' dans une regex pour correspondre à n'importe quelle séquence de saut de ligne Unicode, donc peut-être' "\\ R?. *:" 'Serait mieux. –