0

这是我对 sphere 的在线法官palin 问题的解决方案。它在 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

4 回答 4

1

<Enter>如果您在程序需要一个数字时 点击,您将收到该错误。

假设您的输入是

2
3 
<Enter>

在处理数字 3 后,您将收到您指出的错误,因为您已经告诉您的例程迭代两次。

顺便说一句,除了围绕数字解析的错误处理之外,您可能还想trim()readLine()方法调用中引入 a:

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

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

于 2009-07-24T21:01:51.433 回答
1

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

现在,当它尝试处理它发现的下一行时,<LF>它认为它读取了一个空字符串。

于 2009-08-23T19:24:45.523 回答
0

你不能假设用户知道如何使用你的程序并且会给你正确的输入。法官可能没有输入任何数字就直接回车了。他/她应该如何知道您的程序需要的输入?一个程序应该优雅地失败,而不是在用户面前因为神秘的错误而崩溃。

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

私有静态函数 readInt(BufferedReader reader) 抛出 IOException
{
    布尔完成 = 假;
    整数结果 = -1;
    而(!完成){
       System.out.print("请输入一个整数:");
       字符串 str = reader.readLine();
       尝试{
          结果 = Integer.parseInt(str);
          完成=真;
       }catch(NumberFormatException 无法转换){
          System.out.println("这不是整数。再试一次。");
       }
    }
    返回结果;
}

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

于 2009-07-24T21:03:02.650 回答
0

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

6
56
87
[Enter]

所以我倾向于同意某处akf一定有额外的Enter事情发生,因为只有当输入行数不足时才会产生这个错误。

于 2009-07-24T21:13:34.483 回答