为什么我在线提交此代码时会出现运行时错误?(jdk 1.7)

时间:2016-07-29 20:32:45

标签: java

这是代码(使用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)

3 个答案:

答案 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.inBufferedReader。在第二次迭代中,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()返回的字符串是数字而不是空。