从控制台读取扫描仪循环

时间:2014-05-03 01:19:08

标签: java for-loop console java.util.scanner

我有这个方法,并且从控制台(键盘)读取一个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();
        }

2 个答案:

答案 0 :(得分:5)

你的问题在这里:

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();
}

答案 1 :(得分:1)

首先,使用一台扫描仪而不是每次都重新创建扫描仪。此外,你的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,则无法在下一个扫描仪中再次使用它。这就是使用一台扫描仪解决问题的原因。