Por que esse programa está dando um erro de tempo de execução no JCreator, mas não no NetBeans?

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Esta é a minha solução para o juiz online da esfera Problema de Palin. Ele funciona bem no NetBeans, mas o juiz está rejeitando minha resposta dizendo que dá a um tempo de execução. Eu tentei no jcreator e diz:

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)

Não estou passando uma corda vazia para analisar, por que isso é isso?

O código:

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));

        }
        }
    }


}

Entrada:

2
808
2133

Linha 73 é: int num = Integer.parseInt(read);

Foi útil?

Solução

Você receberá esse erro se você acertar <Enter> Quando o programa está esperando um número.

Suponha que sua contribuição seja

2
3 
<Enter>

Você receberá o erro que indicou após o processamento do número 3, como informou sua rotina para iterar duas vezes.

Como um aparte, além do manuseio de erros em torno do número de análise, você também pode querer apresentar um trim() para o readLine() Chamadas de método:

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

Isso permitirá que você lide graciosamente com a entrada no caso de o usuário colocar o espaço em branco em torno dos números.

Outras dicas

Apenas um palpite: poderia haver um problema com diferentes separadores de final de linha. Por exemplo, seu programa realmente recebe 2<CR><LF>808<CR><LF>2133<CR><LF>, pensa que a linha termina no <CR> e processa a linha.

Agora, quando tenta processar a próxima linha, encontra <LF> O que faz pensar que leu uma corda vazia.

Você não pode assumir que o usuário sabe como usar seu programa e fornecerá uma entrada correta. O juiz provavelmente acertou Enter, sem digitar nenhum número. Como ele/ela deve saber a contribuição que seu programa exige? Um programa deve falhar graciosamente, não explodir no rosto do usuário com erros enigmáticos.

Você deve estar fazendo algo como o seguinte, para que o usuário saiba o que fazer:

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;
}

Além disso, você não deve usar um especificador de exceção com a função principal (ou seja, não use "lances" na assinatura de "Main"). Você deve lidar com esses ioeExceptions e imprimir uma mensagem bonita e inteligível para o usuário, mesmo que não haja nada que você possa fazer sobre a exceção para corrigi -lo ou fazê -lo desaparecer.

Acabei de executar seu código de exemplo no Eclipse 3.4 sem erro. Eu só consegui induzir um erro semelhante quando não forneci o número especificado de casos de teste, ou seja:

6
56
87
[Enter]

Então, estou inclinado a concordar com akf que deve haver um extra Enter acontecendo em algum lugar, porque esse erro será gerado apenas quando houver linhas de entrada insuficientes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top