我有这个方法,这个想法是从控制台(键盘)读取int数字序列并将它们全部添加到ArrayList中,我使用类Scanner读取数字,但在for循环中不起作用,它抛出"java.util.NoSuchElementException"。
public static int mayorNumberSecuence(){
System.out.println("Give me a size ");
Scanner sn = new Scanner(System.in);
int n = sn.nextInt();
sn.close();
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i=0; i<= n; ++i){
System.out.println("Give me a number ");
Scanner sn2 = new Scanner(System.in);
int in = sn2.nextInt();
list.add(in);
sn2.close();
}
你的问题在这里:
Scanner sn = new Scanner(System.in);
int n = sn.nextInt();
sn.close();
您正在关闭当前的Scanner
,这将关闭用于读取数据的InputStream
,这意味着您的应用程序将不再接受来自用户的任何输入。这就是为什么创建一个新的Scanner
来读取System.in
是行不通的。即使您使用System.in
创建另一种阅读器也无法工作。
System.in
时,您创建一个单个读取器(在本例中为Scanner
),它将适用于所有应用程序。所以,你的代码应该是这样的:
System.out.println("Give me a size ");
Scanner sn = new Scanner(System.in);
int n = sn.nextInt();
//sn.close();
List<Integer> list = new ArrayList<Integer>();
for (int i=0; i < n; ++i){
System.out.println("Give me a number ");
//Scanner sn2 = new Scanner(System.in);
int in = sn.nextInt();
list.add(in);
//sn2.close();
}
首先,使用一个扫描器,而不是每次都重新创建一个扫描器。另外,for循环会额外循环一次。
Scanner sn = new Scanner(System.in);
System.out.println("Give me a size ");
int n = sn.nextInt();
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++){
System.out.println("Give me a number ");
int in = sn.nextInt();
list.add(in);
}
sn.close();
这对我来说很好,在列表的最后包含了我输入的所有数字。
你可以通过打印列表来测试它:
System.out.println(list);
旧代码的问题是,当您在扫描器上使用.close()
时,它关闭底层的InputStream
,即System.in
。如果关闭System.in
,则不能在下一个扫描器中再次使用它。这就是为什么使用一个扫描器可以解决这个问题。