从文件读取双精度时输入不匹配
我必须编写一个程序,它将从文本文件“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