#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.