Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java扫描程序-两个分隔符和异常_Java_Java.util.scanner_Delimiter - Fatal编程技术网

Java扫描程序-两个分隔符和异常

Java扫描程序-两个分隔符和异常,java,java.util.scanner,delimiter,Java,Java.util.scanner,Delimiter,我想读取具有以下格式的文件: 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

我想读取具有以下格式的文件:

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)

或者,只需阅读整行内容,然后使用拆分:

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

或者,只需阅读整行内容,然后使用拆分:

String nextLine=in.nextLine();
String[] splitted= nextLine.split(";|\\s");
您的正则表达式应该是:

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)
第二个循环实际抛出异常以解析double

我们可以看到第二个customerID为空

对于第二个循环,Price值是:milk,因此它将抛出inputmaschException for Double parse

您的正则表达式应该是:

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)
第二个循环实际抛出异常以解析double

我们可以看到第二个customerID为空


对于第二个循环,价格值是:milk,因此它会抛出InputMismatchException for Double parse

你能发布stacktrace吗?@JordiCastilla我已经更新了帖子。很遗憾,你在Windows上,因为你在Unix系统上不会有这个问题:P.但是你已经得到了一个解决方案的答案。你能发布你的stacktrace吗?@JordiCastilla我已经更新了帖子。很遗憾,你在Windows上,因为在Unix系统上不会出现此问题:P。但您已经得到了解决方案的答案。\\s已经包括\\n:@Tom good point mate,thx。我将删除答案的第一部分,我仍然相信阅读整行文字是最简单、最安全的方法。因此,我将该部分保留为应答的一部分,然后您只需要在中修复方法调用;P.\\s已包括\\n:@Tom good point mate,thx。我将删除答案的第一部分,我仍然相信阅读整行文字是最简单、最安全的方法。因此,我将该部分保留为应答的一部分,然后您只需要在中修复方法调用;答案是正确的,但解释不精确。请重新检查您写的内容以及失败的原因。解决方案是正确的,但解释不准确。请重新检查您所写的内容以及失败的原因。