Несоответствие ввода при чтении double из файла

#java #text-files #inputmismatchexception

#java #текстовые файлы #исключение inputmismatchexception

Вопрос:

Я должен написать программу, которая будет считывать имена и остатки из текстового файла «balances.txt » и организуйте в отчет, который затем сведет остатки в общую сумму. Это то, что содержит файл:

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

Я изначально написал код, который дал мне именно то, что я хотел, но мне сказали не использовать циклы, массивы или parseDouble . Теперь я попробовал следующее, но я продолжаю получать ошибку каждый раз, когда я использовал nextDouble . Код:

 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);
        }
    }
}
  

Это вывод и трассировка стека исключений:

 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) `
  

Комментарии:

1. Выполните next , next , затем nextDouble , чтобы продвинуть сканер и получить правильный ввод.

2. нам нужно видеть код, который не работает, а не код, который работает

3. извините, я забыл добавить код, с которым боролся

4. @Derek вы используете разделитель, поэтому он получает неверный ввод

5. @Derek useDelimiter вернет новый объект сканера для использования

Ответ №1:

Если вы посмотрите на Javadoc:

useDelimiter

public Scanner useDelimiter(String pattern)

Устанавливает шаблон, разделяющий этот сканер, в шаблон, созданный из указанной строки.

Теперь, если вы посмотрите, как вы делаете свой:

 in.useDelimiter(",");
  

В качестве разделителя будут использоваться запятые, теперь давайте посмотрим на ваш текстовый файл:

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

Сначала может показаться, что с запятыми все в порядке, но поскольку вы установили разделитель, это то, что происходит:

Сначала вы вызываете in.next() , который возвращает:

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

Это нормально, но при последующем вызове in.nextDouble() происходит следующее:

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

Как вы можете видеть, следующая строка также выбирается вместе с double, что не является допустимым double . Это приводит к тому, что Java сообщает an InputMismatchException , поскольку ожидаемый ввод — это не то, что вы получаете — строка. Чтобы бороться с этим, используйте регулярное выражение для разделения новых строк:

 in.useDelimiter(",|n");
  

Это будет соответствовать новым строкам и запятым, поэтому оно будет правильно разделять. Pipe ( | ) означает, что он будет ограничивать либо. Это будет корректно выводить:

 JAKIE JOHNSON
2051.59
  

Комментарии:

1. useDelimiter Метод возвращает Scanner объект, разве это не нужно использовать?

2. Я так не считаю @ScaryWombat.