#java #file #while-loop
#java #файл #цикл while
Вопрос:
Я пытаюсь прочитать список токенов из текстового файла в отдельные переменные с помощью while
цикла.
Каждая строка в текстовом файле звучит так: String
, Double
, Int
, Int
Boolean
, InputMisMatchException
и всего 11 строк, но я получаю double
для String
строки после в-строки.
Текстовый файл читается как
- AC 120.99 423 70 false
- Тостер 18.99 101 30 верно
- Тостер 11.97 201 100 false
- Yoyo 5.99 223 68 false и т.д.
Я попытался прочитать файл с помощью .hasNext
и .hasNextLine
. При изменении double
на String
я получаю ошибку для следующего, Int
и изменение этого на String
снова переносит ошибку на следующий, Int
но изменение этого не приводит к дальнейшему перемещению исключения.
while (infp.hasNextLine() amp;amp; count < LIMIT) {
String Product_description = infp.next();
double cost_per_item = infp.nextDouble(); //line 43
int product_id = infp.nextInt();
int quantity_at_hand = infp.nextInt();
boolean domestic_origin = infp.hasNext();
items[count] = new Item(Product_description, cost_per_item,
product_id, quantity_at_hand,
domestic_origin);
count ;
}
Предполагается, что все токены считываются в переменные и просто создаются отдельные объекты для каждой строки в текстовом файле. Но из-за ошибки я полагаю, что это только чтение первого, String
затем выбрасывает исключение для double
.
Исключение в строке 43:
Exception in thread "main"
java.util.InputMismatchException at
java.util.Scanner.throwFor(Unknown Source) at
java.util.Scanner.next(Unknown Source) at
java.util.Scanner.nextDouble(Unknown Source) at DB_Master.main(DB_Master.java:43)
Комментарии:
1.
boolean domestic_origin = infp.hasNext();
странно2. Вы упоминаете, что есть информация для
Boolean
, но вы ее не читаете, вы просто проверяете, есть ли что-то для чтенияhasNext
. Итак, во второй строке, когда вы получаетеString
информацию, вы фактически получаетеBoolean
из предыдущего «элемента». И затем вы читаете дляDouble
но все еще находитесь наString
линии.3. Возможно, было бы неплохо отредактировать ваш вопрос, включив в него одну или две строки фактического примера из файла. Во втором абзаце не совсем ясно (для меня), находится ли каждое значение в новой строке, с 11 группами по 5 строк, или все 5 значений находятся в одной строке; если это последнее, было бы хорошо сказать, какие разделители есть между каждым значением.
4. какую ide вы используете?
5. Вы должны следовать соглашениям об именовании Java: имена переменных записываются в camelCase. Это означает, что они начинаются со строчной буквы и не содержат подчеркиваний.
Ответ №1:
как вы знаете, метод nextDouble настраивает двойное значение
double nextDouble()
Returns the next token as a long. If the next token is not a float or is out of range, InputMismatchException is thrown.
попробуйте ввести данные в этом формате
например: 34,2 вместо 34,2
или попробуйте преобразовать ваш сканер с помощью locale
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
Экземпляр этого класса способен сканировать числа в стандартных форматах, а также в форматах локали сканера. Начальный язык сканера — это значение, возвращаемое методом Locale.getDefault(); оно может быть изменено с помощью useLocale(java.util.Метод Locale)
Локализованные форматы определяются в терминах следующих параметров, которые для конкретной локали берутся из объекта DecimalFormat этой локали, df, и его объекта DecimalFormatSymbols и DecimalFormatSymbols, dfs.
для получения дополнительной ссылки см. Java docs
все еще не работает, попробуйте выполнить синтаксический анализ, проверив тип ввода.
//************************************************************************
// MixedTypeInput
// This application demonstrates testing before reading to be
// sure to use the correct input method for the data.
//************************************************************************
import java.io.*;
import java.util.Scanner;
public class MixedTypeInput
{
public static void main(String[] args)
{
double number;
Scanner in = new Scanner(System.in);
System.out.println("Enter your gross income: ");
if (in.hasNextInt())
{
number = (double)in.nextInt();
System.out.println("You entered " number);
}
else if (in.hasNextFloat())
{
number = (double)in.nextFloat();
System.out.println("You entered " number);
}
else if (in.hasNextDouble())
{
number = in.nextDouble();
System.out.println("You entered " number);
}
else
System.out.println("Token not an integer or a real value.");
}
}
Комментарии:
1. Следует упомянуть, что этот код является прямой копией некоторого кода на cs.utexas.edu/users/ndale/Scanner.html .