这是代码(使用IntelliJ idea jdk 1.8) 它对我来说效果很好,但每当我在在线门户网站(jdk 1.7)中提交它时都会显示运行时错误。我应该做些什么改变? 我不知道导致错误的是什么。
import java.lang.String;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
int n,k;
int i=0;
int sum=0;
do {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
n = Integer.parseInt(s);
String s1 = reader.readLine();
k = Integer.parseInt(s1);
reader.close();
}while ( n<0 || k>java.lang.Math.pow(10,9) || n<k );
for (i=0 ; i<=k ; i=i+2){
sum+= fact(n)/(fact(i)*fact(n-i));
}
System.out.print(sum);
}
public static int fact(int n) {
int j=1;
while(n!=0){
j=j*n;
n--;
}
return j;
}
}
我不想使用扫描仪
错误:
Exception in thread "main" java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:542)
at java.lang.Integer.parseInt(Integer.java:615)
at Main.main(Main.java:18)
答案 0 :(得分:1)
通常在使用在线IDE /编译器时,您需要在运行程序之前键入输入 。在线工具可能不会提示您输入,这可能导致您的变量设置为null。空变量将导致您看到的错误。
如何解决这个问题取决于您使用的在线工具。例如,如果您正在使用Ideone,请在运行程序之前在“输入输入(stdin)”或“输入”文本框中键入输入。对于您的程序,由于您使用的是readLine(),请将输入放在不同的行上,如this picture中所示。
我将您的代码复制并粘贴到Ideone中。如果我没有在输入文本框中输入任何内容,我会看到相同的错误。但是如果我在运行程序之前输入了输入,那么代码运行时没有错误。
答案 1 :(得分:1)
堆栈跟踪非常清楚,问题来自于Main.main()
将null
传递给Integer.parseInt()
。它会报告parseInt()
第18行显示的Main.java
次调用;当你提出它时,它与你的来源并不完美排列,但它适合这一行:
n = Integer.parseInt(s);
此时的字符串s
刚刚通过BufferedReader
的{{1}}方法获得 - 这表明基础流中没有更多可用数据(最终,{ {1}})。
如果它发生在你的循环的第一次迭代中,那可能会有点令人惊讶,但是在那次迭代结束时你自己 关闭 readLine()
,这也关闭了所有包裹的System.in
和BufferedReader
。在第二次迭代中,Reader
已关闭,您无法从中读取任何内容。您应该在循环外部初始化InputStream
,并等待关闭它,直到您退出循环:
System.in
即使你没有关闭底层流,你肯定会缓冲它的输入,然后可能会将一些缓冲输入与BufferedReader
一起抛出。这本身可能会导致程序比预期更早地观察到文件结束。例如,如果您将 BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
do {
// do something with 'reader'
} while ( /* some condition */ );
reader.close();
移到循环外部,但仍然在循环的每次迭代中创建并从新BufferedReader
读取,则可能会发生这种情况。
此外,最好检查每次读取是否成功读取一行,并处理没有一行的情况(由close()
表示返回)。但是,对于提交给在线解决方案检查程序,可以合理地假设输入符合您的期望。
答案 2 :(得分:0)
您必须确保从readline()返回的字符串是数字而不是空。