2009-06-12 9 views
0

Bonjour, Je suis coincé sur un simple exercice Java, j'espère que quelqu'un peut vous aider. Désolé, si c'est vraiment simple, je suis un débutant java.Analyser java main args [] erreurs de tableau

Ce que je vais avoir du mal avec: si l'utilisateur entre une chaîne autre que « l'aide » tels que « foo » j'obtiens l'erreur suivante:

Exception in thread "main" java.lang.NumberFormatException: For input string: "foo" 

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 

at java.lang.Integer.parseInt(Integer.java:447) 

at java.lang.Integer.parseInt(Integer.java:497) 

at NumberGuess.main(NumberGuess.java:10) 

Ce que je pense ne se passe: « foo "n'est pas attrapé par" else "car args [0] est une référence d'objet et pas vraiment une chaîne. Ce que je veux savoir: Comment attraper tout autre que «aide» ou les chiffres «1» à «5»?

Voici le code ...

public class NumberGuess { 

public static void main(String args[]){ 

    int r; 
    int g; 

    if ((args[0].compareTo("help")) == 0){ 
     System.out.println("Enter a number between 1-5 to play."); 
    } else if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){ 

     r = ((int)(Math.random())); 
     g = Integer.parseInt(args[0]); 

     if (r == g){ 
      System.out.println("YOU WON!"); 
     } else { 
      System.out.println("Wrong: number was " + r); 
     } 

    } else { 
     System.out.println("Something went horribly wrong."); 

    }}} 
+0

Juste pour info, pour des arguments plus complexes, je suggérerais commons-cli. – KitsuneYMG

Répondre

3

la logique du programme est essentiellement, « si l'argument zéro n'est pas « aide », parse comme un entier & hellip; "À ce stade, l'exception est levée, car" foo "n'est pas un nombre entier valide

L'approche la plus simple est d'attraper le NumberFormatException et imprimer un message plus utile.

if ("help".equals(args[0])) { 
    System.out.println("Enter a number between 1 and 5 to play."); 
} 
else { 
    int number; 
    try { 
    number = Integer.parseInt(args[0]); 
    } 
    catch (NumberFormatException ex) { 
    System.out.println("Input is not an integer: " + args[0]); 
    return; 
    } 
    if ((number < 1) || (number > 5)) { 
    System.out.println("Number out of bounds: " + number); 
    return; 
    } 
    int r = new java.util.Random().nextInt(5) + 1; 
    if (number == r) 
    System.out.println("You won!"); 
    else 
    System.out.println("You lost!"); 
} 
+0

merci :) et merci à tous pour les réponses rapides vraiment tout à fait incroyable –

0

Comme vous l'avez remarqué, parseInt déclenche une exception si vous essayez d'analyser une chaîne qui ne représente pas correctement une erreur; try/catch est la construction de Java pour attraper de telles exceptions et les traiter - regardez-le dans vos documents Java préférés!

+1

C'est essayer/attraper en Java, en fait. –

+0

Oups, merci @mmyers, éditer la réponse pour corriger cela! –

1

La première chose qu'il fait après avoir cherché « Aide » tente de l'analyser comme un numéro:

g = Integer.parseInt(args[0]); 

Ce que vous pouvez essayer de faire est de prendre cette exception en changeant cette ligne à:

try { 
    g = Integer.parseInt(args[0]); 
} catch(NumberFormatException e) { 
    System.out.println("The first parameter was supposed to be a number!"); 
    System.exit(1); 
} 

Si vous vouliez dire accepter des paramètres tels que « foo 1 », alors vous devriez être analysez args [1] le nombre et args [0] vous devriez tester pour voir si elle est « foo » comme ceci:

if(args[0].equalsIgnoreCase("foo")) { 
    // now we know foo is the first arg. Parse args[1]! 
    ... 
} 

Oh, au fait. Les nombres "aléatoires" dans la plupart des langues sont un nombre entre 0 et 1. Ils ressemblent généralement à ".108937190823 ..."

Si vous voulez vérifier un nombre comme 1-10, vous devez faire quelque chose comme ça :.

Random().nextInt(10) + 1; // (Thanks @mmyers) 

(pas tout à fait sûr que ce soit la bonne façon de le faire, mais il est proche

+0

La meilleure façon de le faire est de créer un objet java.util.Random et d'appeler nextInt (10) dessus. Cela donne un int dans la plage [0,9], que vous pouvez ensuite ajouter 1 à. –

+0

@mmyers merci! Je n'ai pas beaucoup joué avec Random sur java - bon à savoir. –

+0

Voir http://java.sun.com/docs/books/effective/excursion-random.html pour une explication de l'algorithme utilisé dans nextInt (int). C'est vraiment très impliqué. –

1

Ce qui se passe ici est que le code va dans le bloc else (comme vous l'aurez deviné) et le bloc autre essaie tout de suite pour convertir le paramètre en un certain nombre (Integer.parseInt (args [0]).Ainsi, vous pouvez ajouter un bloc catch try pour le traitement de ces scénarios:

public class numberGuess {

public static void main (String args []) {

 int r; 
    int g; 
    int temp; 

    if ((args[0].compareTo("help")) == 0){ 
      System.out.println("Enter a number between 1-5 to play."); 
    } else { 
      try{ 
       temp = Integer.parseInt(args[0]); 
      }catch(NumberFormatException e){ 
       System.out.println("Please enter a number"); 
       System.exit(-1); 
      } 
      if (Integer.parseInt(args[0]) > 0 && Integer.parseInt(args[0]) <= 5){ 
      r = ((int)(Math.random())); 
      g = Integer.parseInt(temp); 

      if (r == g){ 
        System.out.println("YOU WON!"); 
      } else { 
        System.out.println("Wrong: number was " + r); 
      } 
      } 

    } else { 
      System.out.println("Something went horribly wrong."); 

    }}} 

Voici une façon d'écrire le code (juste une suggestion).