while (myFile.hasNextLine()) {
if(myFile.next().equals("Oval")) {
System.out.println("this is an Oval");
}
else if(myFile.next().equals("Rectangle")) {
System.out.println("this is an Rectangle");
}
该文件包含以下内容
椭圆形10 10 80 90红色
椭圆形20 20 50 60蓝色
矩形10 10 100 100绿色
我想提取数据并根据行开头指示的类型将它们传递给特定的构造函数。
但是我得到了这个奇怪的输出
这是一个椭圆形 线程“main”java.util.NoSuchElementException中的异常 这是一个矩形 在java.util.Scanner.throwFor(Scanner.java:907) 这是一个矩形 在java.util.Scanner.next(Scanner.java:1416) 在TestMain.main(TestMain.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:601) 在com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
使用退出代码1完成处理
答案 0 :(得分:4)
了解当您在Scanner对象上调用next()
时,它会吃掉下一个令牌,然后将其返回给您。如果您没有将返回的String分配给变量,那么它将永远丢失,下次您调用next()
时,您将获得一个新令牌。获取令牌要好得多,将其分配给String变量然后进行if测试。不要在if布尔测试块中调用next()
。
,例如:
while (myFile.hasNextLine()) {
// get the token **once** and assign it to a local variable
String text = myFile.nextLine();
// now use the local variable to your heart's content
if(text.equals("Oval")) {
System.out.println("this is an Oval");
}
else if(text.equals("Rectangle")) {
System.out.println("this is an Rectangle");
}
此外,如果您测试的是hasNextLine()
,那么您应该致电nextLine()
,而不是next()
,而您应该只拨打 一次 for each hasNextLine。
从文本文件中提取数据行时,我有时会使用多个扫描程序。例如:
Scanner fileScanner = new Scanner(myFile);
while (fileScanner.hasNextLine()) {
Scanner lineScanner = new Scanner(fileScanner.nextLine());
// use the lineScanner to extract tokens from the line
lineScanner.close();
}
fileScanner.close(); // likely done in a finally block after null check
答案 1 :(得分:1)
您需要将next()
与hasNext()
方法调用相匹配才能匹配单个字符串令牌
while (myFile.hasNext()) {
String token = myFile.next();
if (token.equals("Oval")) {
System.out.println("this is an Oval");
}
...
}