我得计算一个数字的阶乘。 由于事实阶乘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,则会引发一些异常
Exception in thread"main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Factorial.main(Factorial.java:14)
如何解决这种情况?
编辑:
我已经更改了异常。对于所有的代码甚至还不到26行,我都表示歉意。 在将代码仅发布到此处之前,我已经在上面放置了一些代码作为注释。
这不是重复的。 事实上,我想知道为什么它不接受0作为输入。 它适用于所有其他输入。
我使用在线编译器https://www.tutorialspoint.com/compile_java_online.php
与PC JDK 1.7的Java编译器一起正常工作,但在在线IDE上引发了异常。
看来异常不是由您的方法fact()引发的,而是从nextInt()内部引发的? (而且您发布的代码甚至没有25行)
您能否分享您的应用运行方式?
我已经检查了您的代码,它运行正常。
可能重复的stackoverflow.com/questions/13729294/
它在其他输入上起作用吗?
可能与Java.Util.Scanner重复NoSuchElementException
如果没有更多可用令牌,将抛出NoSuchElementException。这是由于调用nextInt()而不检查是否有可用的整数引起的。为了防止发生这种情况,您可以考虑使用hasNextInt()来检查是否还有其他标记可用。链接。
修改了代码并添加了hasNextInt,这样就不会抛出NoSuchElementException并在main方法末尾关闭sc.close()来关闭资源
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();
}
在线IDE可能正在对数据进行某种预处理,
用零打的不是很好。
TutorialPoint具有针对多种语言的在线编译器,并且很有可能
这些都共享一些共同的后端,可以完成传递文本的魔力
从浏览器到他们的服务器。我不确定是哪种处理
发生在后面,但我可以想象这就像修剪
数字左边的不必要的零或类似的东西。
我在标准C中使用函数sscanf遇到了相反的问题,
当输入字符串为空时,预期会失败(返回0)
姐妹函数scanf,但它仍返回成功并将零存储在整数中
变量。
顺便说一句,如果您仅将前导空格或 n添加到零,则一切正常
正好。