从文件读取双精度时输入不匹配

我必须编写一个程序,它将从文本文件“balances.txt”中读取名称和余额,并组织成一个报告,然后将余额总计为总计。 这是文件包含的内容:

JAKIE JOHNSON,2051.59 SAMUEL PAUL SMITH,10842.23 ELISE ELLISON,720.54 

我最初写的代码给了我我想要的东西,但被告知不要使用循环,数组或parseDouble 。 我现在尝试了以下操作,但每次使用nextDouble都会出现错误。 代码:

 import java.io.File; import java.text.NumberFormat; import java.text.DecimalFormat; import java.io.FileInputStream ; import java.io.FileNotFoundException ; import java.io.IOException ; import java.util.Scanner ; public class BankFile { public static void main(String[] args) throws IOException { Scanner fileIn = null; try { String filename = "balances.txt" ; File newFile = new File(filename); Scanner in = new Scanner(newFile); in.useDelimiter(","); String name = in.next(); System.out.println(name); // trying to see if first name will display double money = in.nextDouble(); System.out.println(money); // trying to see if first double will display } catch (FileNotFoundException e) { System.out.println("File not found."); System.exit(0); } } } 

这是输出和exception堆栈跟踪:

 JAKIE JOHNSON 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 Lab2.main(BankFile.java:52) ` 

如果你看一下Javadoc :

useDelimiter

public Scanner useDelimiter(String pattern)

将此扫描器的分隔模式设置为从指定的String构造的模式。

现在,如果你看看你如何做你的:

 in.useDelimiter(","); 

这将使用逗号作为分隔符,现在让我们看一下你的文本文件:

 JAKIE JOHNSON,2051.59 SAMUEL PAUL SMITH,10842.23 ELISE ELLISON,720.54 

起初看起来似乎逗号很好,但是既然你已经设置了分隔符,就会发生这种情况:

首先调用in.next()返回:

 JAKIE JOHNSON,2051.59 ^^^^^^^^^^^^^ 

那没关系,但是当你调用in.nextDouble() ,会发生以下情况:

 JAKIE JOHNSON,2051.59 ^^^^^^^ SAMUEL PAUL SMITH,10842.23 ^^^^^^^^^^^^^^^^^ 

如您所见,下一行也会与double一起选中,而double不是有效的double。 这会导致Java报告InputMismatchException ,因为预期的输入不是你得到的 – 一个字符串。 要解决此问题,请使用正则表达式来分隔换行符:

 in.useDelimiter(",|\n"); 

这将匹配新行逗号,因此它将正确分隔。 管道( | )表示它将分隔。 这将正确输出:

 JAKIE JOHNSON 2051.59