为什么这个程序在jcreator上给出运行时错误而在netbeans上没有?

时间:2009-07-24 20:46:53

标签: java runtime-error

这是我对球体在线评判palin problem的解决方案。它在Netbeans上运行良好,但法官拒绝我的回答说它给出了RuntimeError。我在JCreator上尝试了它,它说:

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:468)
    at java.lang.Integer.parseInt(Integer.java:497)
    at Main.main(Main.java:73)

我没有传递一个空字符串来解析它,为什么会这样?

代码:

import java.io.*;
import java.util.*;



class Main {

    public static int firstPalinLargerThanNum(int num){

        int foundPalin =0;

        int evalThisNum = ++num;

        while (true){


        if (isPalin(evalThisNum))


            break;

        evalThisNum++;
        }

        foundPalin = evalThisNum;
        return foundPalin;

    }

    public static boolean isPalin(int evalThisNum){

           boolean isItPalin = false;

           int dig=0;
           int rev=0;


          int  n = evalThisNum;

          while (evalThisNum > 0)
          {

           dig = evalThisNum % 10;
           rev = rev * 10 + dig;
           evalThisNum = evalThisNum / 10;

          }

           if (n == rev) {

               isItPalin=true;
           }

           return isItPalin;

    }


    public static void main(String args[]) throws java.lang.Exception{

        BufferedReader r1 = new BufferedReader(new InputStreamReader(System.in));

        /*BufferedReader r1 = new BufferedReader (new FileReader(new File ("C:\\Documents and Settings\\Administrator\\My Documents\\NetBeansProjects\\Sphere\\src\\sphere\\sphere\\PALIN_INPUT.txt")));*/

        String read = r1.readLine();

        int numberOfTestCases = Integer.parseInt(read);

        for (int i=0; i<numberOfTestCases;i++){

        read = r1.readLine();

        if (read!=null){

        int num = Integer.parseInt(read);

        System.out.println(firstPalinLargerThanNum(num));

        }
        }
    }


}

输入:

2
808
2133

第73行是:int num = Integer.parseInt(read);

4 个答案:

答案 0 :(得分:1)

如果您在程序预期某个号码时点击<Enter>,则会收到该错误。

假设您的输入是

2
3 
<Enter>

您将在处理完第3号后收到错误消息,因为您告诉您的例程重复两次。

另外,除了围绕数字解析的错误处理之外,您可能还想在trim()方法调用中引入readLine()

String read = r1.readLine().trim();

这将允许您在用户放入数字周围的空格时优雅地处理输入。

答案 1 :(得分:1)

只是一个疯狂的猜测:不同的行尾分隔符可能存在问题。 例如。您的程序实际获得2<CR><LF>808<CR><LF>2133<CR><LF>,认为该行在<CR>处结束并处理该行。

现在当它试图处理下一行时,它找到了<LF>,这使它认为它读取了一个空字符串。

答案 2 :(得分:0)

您不能假设用户知道如何使用您的程序并且会给您正确的输入。法官可能在不输入任何号码的情况下击中了输入。他/她应该如何知道您的程序需要的输入?一个程序应该优雅地失败,而不是在用户的脸上因为神秘的错误而爆炸。

您应该执行以下操作,以便用户知道该怎么做:

private static function readInt(BufferedReader reader) throws IOException
{
    boolean done = false;
    int result = -1;
    while ( ! done ){
       System.out.print("Please enter an integer: ");
       String str = reader.readLine();
       try{
          result = Integer.parseInt(str);
          done = true;
       }catch(NumberFormatException cantconvert){
          System.out.println("That isn't an integer. Try again.");
       }
    }
    return result;
}

此外,您不应该使用带有main函数的异常说明符(即,不要在“main”的签名中使用“throws”)。您应该处理这些IOExceptions并向用户打印一个漂亮且可理解的消息,即使您无法对异常进行修复或使其消失。

答案 3 :(得分:0)

我刚刚在Eclipse 3.4下运行了您的示例代码而没有错误。当我没有提供指定数量的测试用例时,我只能引起类似的错误,

6
56
87
[Enter]

所以我倾向于同意akf在某处发生额外的Enter事件,因为只有在没有足够的输入行时才会产生此错误。