这是我对球体在线评判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);
答案 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
事件,因为只有在没有足够的输入行时才会产生此错误。