【问题标题】:Java Scanner - two delimiters and exceptionJava Scanner - 两个分隔符和异常
【发布时间】:2015-10-27 09:44:49
【问题描述】:

我想读取一个格式如下的文件:

c00004;Doe John;bananas;4.0;50.0
c00003;Doe John;milk;4.0;5.0
c00001;Doe John;milk;4.0;10.0
c00001;Doe John;milk;5.0;2.0

使用此代码:

Scanner in = new Scanner(Paths.get(fileName));
in.useDelimiter(";|\\s");

while(in.hasNext())
{
    String customerID = in.next();
    String surname = in.next();
    String firstName = in.next();
    String productName = in.next();
    double price = in.nextDouble();
    double quantity = in.nextDouble();

    Purchase newPurchase = new Purchase(customerID, surname, firstName, productName, price, quantity);
}

in.close();

在读取第二行数据的过程中出现输入不匹配异常。任何想法为什么会这样?

编辑: 如果我在读取后输出每个变量,则输出为:

c00004 Doe John bananas 4.0 50.0 
 c00003 Doe John 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 CustomersPurchaseSortFind.readFile(CustomersPurchaseSortFind.java:31)
    at Main.main(Main.java:9)

【问题讨论】:

  • 你能发布你的堆栈跟踪吗?
  • @JordiCastilla 我已经更新了帖子。
  • 好吧,太糟糕了,你在 Windows 上,因为你不会在 Unix 系统上遇到这个问题:P。但是您已经得到了解决方案的答案。

标签: java java.util.scanner delimiter


【解决方案1】:

你的正则表达式应该是:

in.useDelimiter(";|\\s+");

因为您的数据在 Windows 中有 \r 并在行尾有新行 \n,在第二个循环中,分隔符将包含 \r 字符作为元素:

    int i = 1;
    while(in.hasNext())
    {
        System.out.println("line: " + i++);
        String customerID = in.next();
        String surname = in.next();
        String firstName = in.next();
        String productName = in.next();
        double price = in.nextDouble();
        System.out.println("Price: " + price);
        double quantity = in.nextDouble();
    }

输出:

line: 1
customerID: c00004
Price: 4.0
line: 2
customerID: 
Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:909)
    at java.util.Scanner.next(Scanner.java:1530)
    at java.util.Scanner.nextDouble(Scanner.java:2456)
    at Test.main(Test.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

异常实际上是由第二个循环解析双精度时抛出的。

我们可以看到第二个customerID 是空的。

对于第二个循环,Price 值为:milk,因此它将为 throw InputMismatchException for Double parse

【讨论】:

  • 解法正确,但解释不准确。请重新检查您写的内容以及失败的原因。
【解决方案2】:

或者只阅读整行然后使用拆分:

String nextLine=in.nextLine();
String[] splitted= nextLine.split(";|\\s");

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
相关资源
最近更新 更多