2017-09-07 5 views
0

Prise en charge d'une liste de chaînes et conversion en float et stockage des valeurs. Je reçois cette erreur lorsque je tape la deuxième valeur que je veux stocker. Voici le code et le fichier texte je lis:Java NumberFormatException Erreur String to Float

public static void readCities() { 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("C:/Users/Luke/workspace/Traveling Sales Person/Destinations/11PointDFSBFS.tsp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      if (sb.length() > 0) { 
       sb.append("\n"); 
      } 
      sb.append(line); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (br != null) { 
       br.close(); 
      } 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
    String contents = sb.toString(); 
    String[] parts = contents.split("NODE_COORD_SECTION");//splits into locations 
    String[] locations = parts[1].split(" "); 
    int counter = 0; 
    for (int i = 1; i < locations.length; i++) { 
     cities[counter] = new City(Float.parseFloat(locations[i+1]), Float.parseFloat(locations[i+2])); 
     counter++; 
    } 
} 

Code d'erreur:

Exception in thread "main" java.lang.NumberFormatException: For input string: "63.860370 
2 
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) 
    at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122) 
    at java.lang.Float.parseFloat(Float.java:451) 
    at TSP.readCities(TSP.java:132) 
    at TSP.main(TSP.java:28) 
+2

Votre chaîne de nombre contient au moins une nouvelle ligne (\ n), qui ne peut pas être analysée dans un Float. Selon 11PointDFSBFS.tsp peut-être aussi un espace, mais puisque vous n'avez pas publié le contenu, il est plus d'une estimation – petul

+1

Vous devriez nous montrer le contenu du fichier. – NiVeR

+1

Veuillez essayer de construire et de fournir un [mcve] qui reproduira l'erreur la prochaine fois - cela vous aurait clairement montré l'erreur, et si ce n'était pas le cas, cela vous aurait conduit à une question beaucoup plus utile ainsi que le reste d'entre nous. – Dukeling

Répondre

0

Comme tous les commentateurs déjà dit: Sans les données réelles, il est plus ou moins deviner, ce qui est le problème, mais avec votre code et le message d'erreur certaines choses peuvent être déjà dit, ce que vous devriez faire indépendamment:

Vous lisez dans toutes les lignes et les mettre dans un StringBuilder, y compris un nouveau saut de ligne. Plus tard, vous faites des splits, mais vous ne supprimez jamais ce saut de ligne, il finira donc dans les données que vous essayez d'analyser comme float. Cela entraînera une erreur d'analyse, car les espaces et les autres espaces ne sont pas supprimés. La meilleure façon de le faire sans changer trop dans votre code est en rognant les valeurs:

cities[counter] = new City(Float.parseFloat(locations[i+1].trim()), Float.parseFloat(locations[i+2],trim())); 

BTW: Quelle est la raison de la création d'une nouvelle variable counter qui est essentiellement i-1 et en utilisant i+1 et i+2 plus tard? Rend la lecture de votre code un peu plus difficile, car vous attendez une logique supplémentaire où les entrées sont ignorées, ce qui n'est pas le cas.

Selon le message d'erreur, le problème est un guillemet et un saut de ligne. Vous ne pouvez pas dire si cette erreur s'est produite pour la première ou la deuxième des deux valeurs analysées et sans la ou les lignes d'origine du fichier d'entrée, c'est difficile à dire, qu'est-ce qui se passe, mais peut-être que je vous ai donné des conseils pour vous permettre de progresser avec votre code.

Si ce n'est pas le cas, nous avons besoin de plus d'informations, en particulier les lignes qui produisent cette erreur, donc l'analyse de votre code devient possible.