计算导致0的阶乘导致NoSuchElementException

时间:2018-09-01 16:09:10

标签: java factorial

我必须计算一个数字的阶乘。由于事实阶乘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.NoSuchElementException     在java.util.Scanner.throwFor(Scanner.java:862)     在java.util.Scanner.next(Scanner.java:1485)     在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上引发异常。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

在线IDE可能正在对数据进行某种预处理, 用零打的不是很好。

TutorialPoint具有用于多种语言的在线编译器,很可能 这些都共享一些共同的后端,可以完成传递文本的魔力 从浏览器到他们的服务器。我不确定是哪种处理 发生在后面,但我可以想象这就像修剪 数字左边的不必要的零或类似的东西。

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

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