2010-02-12 6 views
3

Je fais un exercice simple à partir d'un livre et je suis un peu confus avec le fonctionnement de la fonction java parseInt. J'ai lu une ligne d'un fichier d'entrée, utilisé le StringTokenizer pour le diviser et maintenant je veux analyser chaque partie comme un entier.Pourquoi Integer.parseInt renvoie NumberFormatException sur une entrée qui semble valide?

J'ai vérifié dans la fenêtre de surveillance que l'entrée de la fonction parseInt est bien une chaîne qui semble être un entier valide (par exemple "35"). Cependant, lorsque je tente d'utiliser la fonction str.charAt sur ma str variable qui contient la valeur « 35 », je reçois des résultats étranges:

str.charAt(0) == "" 
str.charAt(1) == "3" 
str.charAt(2) == "" 
str.charAt(3) == "5" 

Cela semble être un problème probablement lié en quelque sorte à l'encodage, donc je l'ai essayé pour le fixer à l'aide de cette façon de lire le fichier:

InputStreamReader reader = new InputStreamReader(new FileInputStream(inputfile), "UTF-8"); 

(j'ai explicitement enregistré le fichier en utilisant le codage UTF-8 dans mon éditeur), mais cela n'a pas aidé. Des idées quel pourrait être le problème et comment le réparer?

EDIT: Mon échantillon

 InputStreamReader reader = new InputStreamReader(new FileInputStream(inputfile), "UTF-8"); 
     BufferedReader bfreader = new BufferedReader(reader); 

     line = bfreader.readLine(); 
     while (line !=null) 
     { 
       String[] valueStrings = line.split(" "); 
       String hole = valueStrings[0]; 

       int[] values = new int[4]; 
       for (int i = 0; i <values.length; i++){ 

        String nr = valueStrings[i+1].trim(); 
        values [i] = Integer.parseInt(nr); 
       } 

       // it breaks at the parseInt here, the rest is not even executed... 

     } 

Répondre

11

Je pense que c'est en fait:

str.charAt(0) == '\0' 
str.charAt(1) == '3' 
str.charAt(2) == '\0' 
str.charAt(3) == '5' 

On dirait qu'il est probablement en fait enregistré en UTF-16 plutôt que UTF-8 - mais si votre éditeur de texte pensait que c'était signifiait pour enregistrer des caractères "null", cela aurait du sens. Essayez de regarder le fichier texte dans un éditeur binaire hexadécimal - je suppose que vous trouverez que tous les autres octets sont 0.

Si cela ne vous aide pas, s'il vous plaît poster un programme court mais complet qui démontre le problème - jusqu'à présent nous avons seulement vu une ligne de votre code.

+0

Vous avez raison, je l'ai vérifié dans l'éditeur hexadécimal et chaque deuxième caractère est zéro. Quoi qu'il en soit, comment puis-je lire un tel fichier? –

+1

Si vous définissez le jeu de caractères sur UTF-16, vous devez le lire ou enregistrer le fichier sous la forme UTF-8 ou par défaut du système. –

+0

Le fichier est lu correctement, le problème est que parseInt échoue quand il essaie d'analyser la chaîne. Y a-t-il un moyen de régler cela? –

Questions connexes