【问题标题】:Scanner : Exception in thread "main" java.util.NoSuchElementException扫描仪:线程“主”java.util.NoSuchElementException 中的异常
【发布时间】:2017-12-05 09:47:56
【问题描述】:

我正在尝试创建一个实用程序类以使用 java.util.Scanner

标准控制台 获取输入
package dbasics;

import java.util.*;


public class Utils {

    public static int getNumericInput() {
        System.out.println("Enter a integer ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.close();
        return n;
    }

    public static int[] getNumericArrayInput(int n) {
        //System.out.println("Enter "+n+"  integers seperated by a whitespace ");
         int[] numbers = new int[n];
         Scanner scanner = new Scanner(System.in);
         for (int i = 0; i < n; i++) {
                 numbers[i] =scanner.nextInt();
             }

         scanner.close();
         return numbers;
    }

}

在另一个类中调用 static 方法时,方法 getNumericInput() 可以正常工作,但以下方法 getNumericArrayInput(int n) 会导致异常。

package dbasics;

public class Demo {

    public static void main(String[] args) {

        int n = Utils.getNumericInput();
        System.out.println("Number "+n);
        int arr[] = Utils.getNumericArrayInput(n);
        for(int i : arr) {
            System.out.println(i);
        }
    }

}

运行此程序会导致以下异常

Enter a integer 
5
Number 5
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at dbasics.Utils.getNumericArrayInput(Utils.java:21)
    at dbasics.Demo.main(Demo.java:9)

我注意到的有趣的事情是,如果我注释掉第一个输入过程,数组输入工作正常

【问题讨论】:

  • 您应该始终使用 try 来处理像 Scanner 这样可关闭的类的资源。您的第一次调用可能会在输入流关闭时关闭它。

标签: java java.util.scanner


【解决方案1】:

您正在关闭导致异常的函数中的 Scanner: 试试这个:

import java.util.*;


class Utils {

    public static int getNumericInput() {
        System.out.println("Enter a integer ");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        return n;
    }

    public static int[] getNumericArrayInput(int n) {
         int[] numbers = new int[n];
         Scanner scanner = new Scanner(System.in);
         for (int i = 0; i < n; i++) {
                 numbers[i] =scanner.nextInt();
             }

         scanner.close();
         return numbers;
    }

}
public class cn {

    public static void main(String[] args) {

        int n = Utils.getNumericInput();
        System.out.println("Number "+n);
        try{
        int arr[] = Utils.getNumericArrayInput(n);

        for(int i : arr) {
            System.out.println(i);
        }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        }
    }

更多信息请阅读this link

【讨论】:

    【解决方案2】:

    第一种方法,不要关闭scanner

    【讨论】:

    • 这不会导致泄漏吗?
    • 不,不会的,你还有元素要通过流消费,为什么要关闭它?
    • 因为它是可关闭的,所以当它超出范围时应该关闭。
    • 我同意,但是如果你深入查看Scanner#close方法,它的源代码也被关闭了,这里的源代码是System.in 它也将被关闭
    • 我知道关闭实例会导致流关闭,但是当调用第二种方法时,它再次创建了一个新的 Scanner 实例,不足以打开输入流再来一次?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2018-03-09
    相关资源
    最近更新 更多