2016-10-12 1 views
1

Je dois écrire un programme qui lit les noms et les balances à partir du fichier texte «balances.txt» et les organise en un rapport qui résume ensuite les soldes en un total. C'est ce que le fichier contient:Non-concordance d'entrée lors de la lecture de double à partir du fichier

JAKIE JOHNSON,2051.59 
SAMUEL PAUL SMITH,10842.23 
ELISE ELLISON,720.54 

je l'avais écrit à l'origine du code qui m'a donné exactement ce que je voulais, mais on m'a dit de ne pas utiliser des boucles, des tableaux, ou parseDouble. J'ai maintenant essayé ce qui suit, mais je continue à recevoir une erreur chaque fois que j'ai utilisé nextDouble. Le code:

import java.io.File; 
import java.text.NumberFormat; 
import java.text.DecimalFormat; 
import java.io.FileInputStream ; 
import java.io.FileNotFoundException ; 
import java.io.IOException ; 
import java.util.Scanner ; 

public class BankFile { 
    public static void main(String[] args) throws IOException { 
     Scanner fileIn = null; 

     try { 
      String filename = "balances.txt" ; 
      File newFile = new File(filename); 
      Scanner in = new Scanner(newFile); 

      in.useDelimiter(","); 

      String name = in.next(); 
      System.out.println(name); 
      // trying to see if first name will display 

      double money = in.nextDouble(); 
      System.out.println(money); 
      // trying to see if first double will display 
     } catch (FileNotFoundException e) { 
      System.out.println("File not found."); 
      System.exit(0); 
     } 
    } 
} 

Ceci est la sortie et exception stacktrace:

JAKIE JOHNSON 
Exception in thread "main" java.util.InputMismatchException 
    at java.util.Scanner.throwFor(Scanner.java:864) 
    at java.util.Scanner.next(Scanner.java:1485) 
    at java.util.Scanner.nextDouble(Scanner.java:2413) 
    at Lab2.main(BankFile.java:52) ` 
+0

Effectuez 'next',' next', puis 'nextDouble' pour avancer le scanner et recevoir la bonne entrée. – Li357

+2

nous avons besoin de voir le code qui ne fonctionne pas, pas le code qui fonctionne –

+0

désolé, j'avais oublié d'ajouter le code avec lequel je luttais – Derek

Répondre

1

Si vous jetez un oeil à la Javadoc:

useDelimiter

public Scanner useDelimiter(String pattern)

Définit le motif de délimitation de ce scanner sur un modèle construit à partir de la chaîne spécifiée.

Maintenant, si vous jetez un oeil à la façon dont vous faites le vôtre:

in.useDelimiter(","); 

Cela utilisera des virgules comme séparateur, maintenant un coup d'oeil à votre fichier texte:

JAKIE JOHNSON,2051.59 
SAMUEL PAUL SMITH,10842.23 
ELISE ELLISON,720.54 

Au début, il peut sembler que les virgules sont bien, mais puisque vous avez défini le délimiteur, voici ce qui se passe:

D'abord vous appelez in.next() qui retourne:

JAKIE JOHNSON,2051.59 
^^^^^^^^^^^^^ 

C'est très bien, mais quand vous appelez ensuite in.nextDouble(), l'arrive ci-dessous:

JAKIE JOHNSON,2051.59 
       ^^^^^^^ 
SAMUEL PAUL SMITH,10842.23 
^^^^^^^^^^^^^^^^^ 

Comme vous pouvez le voir, la ligne suivante est également sélectionnée avec le double, qui ISN 't un double valide. Cela provoque Java à signaler un InputMismatchException, comme l'entrée attendue n'est pas ce que vous obtenez - une chaîne. Pour lutter contre cela, utilisez une expression régulière aussi délimiter les nouvelles lignes:

in.useDelimiter(",|\n"); 

Cela correspond et les nouvelles lignes virgules, donc il correctement délimiter. Le tuyau (|) signifie qu'il délimitera soit. Cela affichera correctement:

JAKIE JOHNSON 
2051.59 
+0

La méthode 'useDelimiter' renvoie un objet' Scanner', n'est-ce pas nécessaire? –

+0

Je ne crois pas aussi @ScaryWombat. – Li357