while 循环的第二次迭代中的 Scanner NoSuchElementException

Scanner NoSuchElementException in the second iteration of while loop

public static void main(String[] args) {
    while(true)
    {
        System.out.println("Want to repeat :");
        Scanner sc = new Scanner(System.in);
        if(!sc.next().equalsIgnoreCase("y"))
            break;
        //Prime number
        //isPrimeNumber();

        //Fibonacci series
        //fibonacciSeries();

        //factorial using recursion
        getFactorialOfaNumber();

        sc.close();
    }
}

我有这个程序,每次我检查来自控制台的输入并根据提供的输入决定是继续还是终止程序。

第一次它运行良好,但在第二次迭代中我得到了 NoSuchElementException.

为什么不要求输入参数就抛出异常。

这是控制台输出。

y
FACTORIAL
Enter a number:
6
Factorial is :720
Want to repeat :
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at com.chandu.main.PrimeNumbers.main(PrimeNumbers.java:12)

我认为此错误意味着您在没有下一个元素的情况下试图获取扫描仪的 next() 元素。您可以通过在下面用 next() 包裹该部分来解决此问题:

if(sc.hasNext())

附带说明一下,如果发生中断,sc 将永远不会关闭,这是不好的做法。我建议在循环外声明 Scanner,并在循环后关闭它。

尝试将 Scanner 对象的初始化放在 while 循环之外,对于关闭指令也是如此:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    while(true)
    {
        System.out.println("Want to repeat :");
        if(!sc.next().equalsIgnoreCase("y"))
            break;
        //Prime number
        //isPrimeNumber();

        //Fibonacci series
        //fibonacciSeries();

        //factorial using recursion
        getFactorialOfaNumber();
    }
    sc.close();
}

每次循环都创建和关闭扫描器不是一个好主意。在您的情况下,您还试图从关闭的 System.in 中读取值,这会导致问题