有人可以帮忙解释为什么这会引发NoSuchElement
例外吗?它似乎发生在最后一行scan.nextInt();
我正在尝试从文件中读取名称并将它们排序为数组,然后在打印后从用户读取选项。
import java.util.ArrayList;
import java.util.Collections;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.NoSuchElementException;
import java.util.Scanner;
public class DeletingNames {
public static void main(String[] args)throws Exception {
int addDelete = 0;
int index = 0;
String addName;
String deleteName;
File namesFile = new File("names.txt");
ArrayList<String> names = new ArrayList<String>();
try {
Scanner scan = new Scanner(namesFile);
while(scan.hasNext()){
names.add(scan.next());
index++;
}
Collections.sort(names);
System.out.println(names);
System.out.println();
System.out.print("Add/delete data?\n1. Add\n2. Delete");
addDelete = scan.nextInt();
scan.close();
}
catch (FileNotFoundException e){
System.err.println("File not found");
}
}
}
答案 0 :(得分:3)
您的Scanner
仍在引用file
而不是System.in
:
scan.close();
scan = new Scanner(System.in);
addDelete = scan.nextInt();
您已经浏览了整个文件,因此没有更多元素。这就是为什么你得到NoSuchElement
例外......
答案 1 :(得分:1)
来自Javadoc:
NoSuchElementException 由nextElement方法抛出 枚举表示该元素中没有更多元素 枚举。
执行流程不会离开此循环
while(scan.hasNext()){
names.add(scan.next());
index++;
}
....
// 'scan' here is invalid, create a new System.in scanner
System.out.print("Add/delete data?\n1. Add\n2. Delete");
addDelete = scan.nextInt(); // Invalid call
代码块,直到没有更多元素从文本文件中读取。因此调用scan.nextInt()
会抛出NoSuchElementException
。您需要一个新的Scanner
来读取用户的输入。
答案 2 :(得分:1)
你的while循环遍历扫描程序中的所有内容(scan.hasNext();),所以当你来到&#34; addDelete = scan.nextInt();&#34; <时,什么都没有。 / p>
如果您想从用户那里获取输入,则需要创建一个新的扫描仪。
答案 3 :(得分:1)
如果没有更多令牌可用,则抛出NoSuchElementException。这是由调用nextInt()而不检查是否有任何可用整数引起的。 抛出此异常表示枚举中没有更多元素。 此异常扩展了RuntimeException类,因此属于在Java虚拟机(JVM)操作期间可能抛出的异常。它是一个未经检查的异常,因此,它不需要在方法或构造函数的throws子句中声明。 最后,自Java的第一个版本以来,存在NoSuchElementException。
java.util.NoSuchElementException是一个RuntimeException,它可以被Java中的不同类抛出,如Iterator,Enumerator,Scanner或StringTokenizer。
根据Javadoc NoSuchElementException由Enumeration的nextElement方法抛出,表示枚举中没有更多元素。
为了防止它发生,您可以考虑使用hasNext()检查是否有更多令牌可用。