计算0的阶乘,导致NoSuchElementException

问题描述 投票:0回答:2

我得计算一个数的阶乘。因为0的事实因子是1.所以我在函数中包括了这个例子。这是代码:

import java.util.*;
public class Factorial {
    static int fact(int n) {
        int result;
        if (n == 0 || n == 1)
            return 1;

        result = fact(n - 1) * n;
        return result;
    }
    public static void main(String args[]) {
        int i, fact = 1;
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        fact = fact(n);
        System.out.println(fact);
    }
}

但如果我将输入设为0,则会引发一些异常

java.util.Scanner.nextInt中java.util.Scanner.next(Scanner.java:1485)java.util.Scanner.throwFor(Scanner.java:862)中线程“main”java.util.NoSuchElementException中的异常( Scanner.java:2117)在Factorial.main的java.util.Scanner.nextInt(Scanner.java:2076)处(Factorial.java:14)

如何解决这种情况?

编辑:

  1. 我已经更改了异常。对于那些代码甚至不是26行的事情,我们都道歉。在此处发布代码之前,我已将上面的代码作为注释。
  2. 这不是重复的。事实上,我想知道它为什么不接受0作为输入。它适用于所有其他输入。
  3. 我使用在线编译器https://www.tutorialspoint.com/compile_java_online.php
  4. 适用于PC JDK 1.7的Java Compiler,但在在线IDE上引发了异常。
java factorial
2个回答
1
投票

如果没有更多的代币,NoSuchElementException将被抛出。这是由调用nextInt()而不检查是否有任何可用整数引起的。为了防止它发生,您可以考虑使用hasNextInt()来检查是否有更多令牌可用。 Link

修改你的代码并添加hasNextInt以便不抛出NoSuchElementException并且sc.close()main方法结束时关闭资源

public static void main(String args[]) {
    int fact = 1;
    Scanner sc = new Scanner(System.in);
    if (sc.hasNextInt()) {
        int n = sc.nextInt();
        fact = fact(n);
        System.out.println(fact);
    }
    sc.close();
}

0
投票

在线IDE可能正在对数据进行某种预处理,这些数据在零处理时效果不佳。

TutorialPoint拥有多种语言的在线编译器,很可能这些都共享一些常见的后端,可以将文本从浏览器传递到服务器。我不确定后面发生了什么样的处理,但我可以想象这就像修剪数字左边不必要的零或类似的东西。

我在标准C中遇到了与sscanf函数相反的问题,当输入字符串为空时,预期会失败(返回0),就像它的姐妹函数scanf一样,但它仍然返回成功并在整数变量中存储零。

顺便说一句,如果你只是添加一个前导空格或\ n到零,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.