这是代码(使用IntelliJ想法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)
堆栈跟踪非常清楚,问题是由于Main.main()
传递null
给引起的Integer.parseInt()
。报告parseInt()
调用出现在的第18行Main.java
; 在您介绍它时,它与您的源代码并不完全一致,但这对这一行来说是正确的:
n = Integer.parseInt(s);
此时的字符串s
只是通过您BufferedReader
的readLine()
方法获得的-这表明基础流中不再有可用数据(最终是System.in
)。
如果它发生在循环的第一次迭代中,那可能会有点令人惊讶,但是您在该迭代的末尾关闭了BufferedReader
自己,并且也关闭了所有包装的Reader
s和InputStream
s。在第二次迭代中,System.in
已关闭,您无法从中读取任何内容。您应该改为BufferedReader
在循环外部进行初始化,并等待将其关闭,直到退出循环为止:
BufferedReader reader =
new BufferedReader(new InputStreamReader(System.in));
do {
// do something with 'reader'
} while ( /* some condition */ );
reader.close();
即使您没有关闭基础流,您肯定也在缓冲来自其的输入,然后可能会将其中一些缓冲的输入与一起扔掉BufferedReader
。这本身可能会使您的程序比预期的更早观察文件结束。例如,如果您将close()
循环移到外部,但是仍然BufferedReader
在每次循环迭代中创建并读取新内容,则可能会发生这种情况。
此外,明智的做法是检查每次读取是否成功读取了一行,并处理没有被读取的情况(由null
返回表示)。但是,要提交给在线解决方案检查器,可以合理地假设输入内容符合您的期望。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句