2009-07-24 6 views
0

Ceci est ma solution pour le juge en ligne de sphère palin problem. Il fonctionne bien sur NetBeans, mais le juge rejette ma réponse en disant qu'il donne un RuntimeError. Je l'ai essayé sur JCreator et il dit:pourquoi ce programme donne-t-il une erreur d'exécution sur jcreator mais pas sur netbeans?

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) 

Je ne suis pas passer une chaîne vide pour qu'il parse, pourquoi est-ce?

Le code:

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

     } 
     } 
    } 


} 

Entrée:

2 
808 
2133 

ligne 73 est: int num = Integer.parseInt(read);

+0

Quelle est l'entrée? Et qu'est-ce que la ligne 73? –

+0

l'entrée est sur le lien, je vais poster ici pour plus de clarté. – andandandand

Répondre

1

Vous obtiendrez cette erreur si vous frappez <Enter> lorsque le programme prévoit un certain nombre.

Supposons que votre entrée est

2 
3 
<Enter> 

Vous recevrez l'erreur que vous avez indiqué après le traitement du numéro 3, comme vous l'avez dit à votre routine pour itérer deux fois.

En aparté, en plus de la gestion des erreurs dans l'analyse syntaxique du numéro, vous pouvez également introduire un trim() aux appels méthode readLine():

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

Cela vous permettra de gérer correctement l'entrée dans la événement que l'utilisateur doit mettre en espace autour des chiffres.

+0

appuyez sur "entrer" quand ... vous voulez dire? –

+0

Il a probablement écrit <entrer>, mais comme il ressemble à HTML le (à cause des symboles inférieurs et supérieurs à), il a été supprimé par le validateur d'entrée de Stack Overflow. –

+0

Voir, le validateur n'a pas respecté mes entités HTML. –

0

Vous ne pouvez pas supposer que l'utilisateur sait comment utiliser votre programme et vous donnera une entrée correcte. Le juge a probablement frappé entrer, sans taper aucun nombre. Comment est-il supposé connaître les informations dont votre programme a besoin? Un programme devrait échouer gracieusement, ne pas exploser dans le visage de l'utilisateur avec des erreurs cryptiques.

Vous devriez faire quelque chose comme ce qui suit, de sorte que l'utilisateur sait ce qu'il faut faire:

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

De plus, vous ne devriez pas utiliser un spécificateur d'exception avec la fonction principale (qui est, ne pas utilisez "throws" dans la signature de "main"). Vous devriez gérer ces IOExceptions et imprimer un message joli et intelligible à l'utilisateur, même s'il n'y a rien que vous puissiez faire à propos de l'exception pour le réparer ou le faire disparaître.

+0

le juge n'est pas un il/elle. C'est un mécanisme automatisé. – andandandand

+0

Je vous suggère de lire le lien. – andandandand

0

Je viens d'exécuter votre exemple de code sous Eclipse 3.4 sans erreur. Je ne ai pu induire une erreur semblable quand je n'ai pas fourni le nombre spécifié de cas de test, -à-dire:

6 
56 
87 
[Enter] 

Je suis plutôt d'accord avec akf qu'il doit y avoir un passe Enter supplémentaire quelque part, car cette erreur ne sera générée que lorsque les lignes d'entrée sont insuffisantes.

+0

La chose que je ne comprends pas, c'est que je ne * * pas * appuyer sur une entrée supplémentaire sur jcreator. – andandandand

+0

Je passerais par plusieurs ensembles d'entrée avec un débogueur. Il doit y avoir quelque chose d'amusant quelque part, surtout si les autres n'ont pas de problèmes. Cela pourrait-il être un problème de système/configuration? –

1

Juste une conjecture: Il pourrait y avoir un problème avec différents séparateurs de fin de ligne. E.g. votre programme obtient effectivement 2<CR><LF>808<CR><LF>2133<CR><LF>, pense que la ligne se termine au <CR> et traite la ligne.

Maintenant, quand il essaie de traiter la ligne suivante, il trouve <LF> qui lui fait croire qu'il a lu une chaîne vide.

Questions connexes