Проблемы с циклом чтения токенов - PullRequest
0 голосов
/ 24 апреля 2019

Я пытаюсь прочитать список токенов из текстового файла в отдельные переменные, используя цикл while.

Каждая строка в текстовом файле имеет вид: String, Double, Int, Int, Boolean, и есть 11 строк, но я получаю InputMisMatchException для строки double после строки String.

Текстовый файл читается как

  1. AC 120.99 423 70 false
  2. Тостер 18,99 101 30 true
  3. Тостер 11,97 201 100 ложь
  4. Йо-йо 5,99 223 68 ложь и т.д.

Я пытался прочитать файл с .hasNext и .hasNextLine. При изменении значения double на String я получаю ошибку для следующего Int, и изменение этого значения на String снова переводит ошибку в следующее Int, но изменение, которое не перемещает исключение далее.

while (infp.hasNextLine() && 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 Ответ

0 голосов
/ 24 апреля 2019

как вы знаете, метод 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

или попробуйтеконвертируйте ваш сканер в локаль

Scanner scanner = new Scanner(System.in).useLocale(Locale.US);

Экземпляр этого класса способен сканировать числа в стандартных форматах, а также в форматах локали сканера.Начальная локаль сканера - это значение, возвращаемое методом Locale.getDefault ();это может быть изменено с помощью метода useLocale (java.util.Locale). Локализованные форматы определяются в терминах следующих параметров, которые для конкретной локали берутся из объекта DecimalFormat этой локали, df, и его объекта и объекта 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.");   

  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...