почему эта программа выдает ошибку во время выполнения в jcreator, но не в netbeans?

StackOverflow https://stackoverflow.com/questions/1180079

  •  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 происходит где-то, потому что эта ошибка будет генерироваться только при недостаточном количестве строк ввода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top