我必须计算一个数字的阶乘。由于事实阶乘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)
如何解决这种情况?
编辑:
答案 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到零,则一切正常 很好。