Проблемы цикла While с чтением токенов

#java #file #while-loop

#java #файл #цикл while

Вопрос:

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

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

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

  1. AC 120.99 423 70 false
  2. Тостер 18.99 101 30 верно
  3. Тостер 11.97 201 100 false
  4. 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 .