我得计算一个数的阶乘。因为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)
如何解决这种情况?
编辑:
如果没有更多的代币,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();
}
在线IDE可能正在对数据进行某种预处理,这些数据在零处理时效果不佳。
TutorialPoint拥有多种语言的在线编译器,很可能这些都共享一些常见的后端,可以将文本从浏览器传递到服务器。我不确定后面发生了什么样的处理,但我可以想象这就像修剪数字左边不必要的零或类似的东西。
我在标准C中遇到了与sscanf函数相反的问题,当输入字符串为空时,预期会失败(返回0),就像它的姐妹函数scanf一样,但它仍然返回成功并在整数变量中存储零。
顺便说一句,如果你只是添加一个前导空格或\ n到零,一切正常。