While循环与读取令牌有关的问题

时间:2019-04-24 07:58:25

标签: java file while-loop

我正在尝试使用while循环将文本列表中的令牌列表读取为单独的变量。

文本文件中的每一行分别为:StringDoubleIntIntBoolean,共有11行,但是我收到了InputMisMatchException行之后的double行的String

txt文件读为

  1. AC 120.99 423 70错误
  2. 烤面包机18.99 101 30是
  3. 烤面包机11.97 201 100 false
  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 :(得分:0)

您知道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.

尝试以这种格式输入

like: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.");   

  }

}