0

我必须计算一个数字的阶乘。事实上,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.next(Scanner.java:1485) 在 java.util.Scanner.throwFor(Scanner.java:862) 在 java.util.Scanner.nextInt( Scanner.java:2117) 在 java.util.Scanner.nextInt(Scanner.java:2076) 在 Factorial.main(Factorial.java:14)

如何解决这种情况?

编辑:

  1. 我已经改变了例外。所有的道歉是的代码甚至不是 26 行。在此处仅发布代码之前,我已将一些代码作为注释放在上面。
  2. 这不是重复的。事实上,我想知道为什么它不接受 0 作为输入。它适用于所有其他输入。
  3. 我使用在线编译器https://www.tutorialspoint.com/compile_java_online.php
  4. 与 PC JDK 1.7 的 Java 编译器一起工作正常,但在在线 IDE 上引发异常。
4

2 回答 2

1

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

修改您的代码并添加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();
}
于 2018-09-01T16:25:01.340 回答
0

在线 IDE 可能正在对不适合使用零的数据进行某种预处理。

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

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

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

于 2018-09-02T00:02:11.833 回答