繁体   English   中英

从控制台扫描仪循环读取

[英]reading from console with scanner in a loop for

我有此方法,并且从控制台(键盘)读取了一个整数序列并将其全部添加到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 ,这意味着您的应用程序将不再接受用户的任何输入。 这就是为什么创建无法从System.in读取的新Scanner的原因。 即使您使用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);

旧代码的问题在于,当您在Scanner上使用.close()时,它将关闭基础InputStream ,即System.in 如果关闭System.in ,则无法在下一个扫描仪中再次使用它。 这就是为什么使用一个扫描仪可以解决此问题的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM