在循环中从控制台读取扫描器



我有这个方法,这个想法是从控制台(键盘)读取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,则不能在下一个扫描器中再次使用它。这就是为什么使用一个扫描器可以解决这个问题。

最新更新