почему эта программа выдает ошибку во время выполнения в jcreator, но не в netbeans?
-
19-09-2019 - |
Вопрос
Это мое решение для онлайн-судьи sphere проблема Пэйлина.Он отлично работает на 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);
Решение
Вы получите эту ошибку, если нажмете <Enter>
когда программа ожидает число.
Предположим, ваш вклад таков
2
3
<Enter>
Вы получите ошибку, на которую вы указали, после обработки числа 3, поскольку вы указали своей программе выполнить повторение дважды.
В качестве отступления, помимо обработки ошибок при разборе чисел, вы также можете захотеть ввести trim()
к тому readLine()
вызовы метода:
String read = r1.readLine().trim();
Это позволит вам изящно обрабатывать входные данные в том случае, если пользователь вставит пробелы вокруг цифр.
Другие советы
Просто дикое предположение:Может ли возникнуть проблема с разными разделителями конца строки?Например.ваша программа на самом деле получает 2<CR><LF>808<CR><LF>2133<CR><LF>
, думает , что линия заканчивается на <CR>
и обрабатывает строку.
Теперь, когда он пытается обработать следующую строку, он находит <LF>
что заставляет его думать, что он прочитал пустую строку.
Вы не можете предполагать, что пользователь знает, как использовать вашу программу, и предоставит вам правильные входные данные.Судья, вероятно, нажал enter, не набрав ни одной цифры.Как он / она должен знать входные данные, которые требуются вашей программе?Программа должна завершаться корректно, а не взрываться перед лицом пользователя загадочными ошибками.
Вы должны делать что-то вроде следующего, чтобы пользователь знал, что делать:
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 (то есть, не используйте "throws" в подписи "main").Вы должны обработать эти IOExceptions и распечатать красивое и понятное сообщение пользователю, даже если вы ничего не можете сделать с исключением, чтобы исправить его или заставить его исчезнуть.
Я только что запустил ваш пример кода в Eclipse 3.4 без ошибок.Мне удалось вызвать подобную ошибку только тогда, когда я не предоставил указанное количество тестовых примеров, т. е.:
6
56
87
[Enter]
Поэтому я склонен согласиться с akf
что должен быть дополнительный Enter
происходит где-то, потому что эта ошибка будет генерироваться только при недостаточном количестве строк ввода.