6

Le problème est trivial, mais il me manque des choses très simples ici et je n'arrive pas à l'attraper. S'il vous plaît aider. J'écris un programme de calculatrice simple pour travailler avec à la ligne de commande. Le code source est donné ci-dessous. Le problème est quand j'utiliser la calculatrice commeUtilisation de * en ligne de commande dans un programme Java

>java SwitchCalc 12 * 5 

il lance un « java.lang.NumberFormatException » pour la chaîne d'entrée: « 002.java » dans l'instruction de l'analyse syntaxique deuxième int args [2]:

int value2 = Integer.parseInt(args[2]) 

Plus tard, j'ai essayé ce qui suit, cela a fonctionné.

>java SwitchCalc 12 "*" 5 
12 * 5 = 60 

Que manque-t-il?

/* 
User will input the expression from command-line in the form: 
>java SwitchCalc value1 op value2 
where, 
value1, and value2 are integer values 
op is an operator in +, -, *, /, % 
Program will evaluate the expression and will print the result. For eg. 
>java SwitchCalc 13 % 5 
3 
*/ 

class SwitchCalc{ 
    public static void main(String [] args){ 
     int value1 = Integer.parseInt(args[0]), 
      value2 = Integer.parseInt(args[2]), 
      result = 0; 

     switch(args[1]){ 
      case "+": 
       result = value1 + value2; 
       break; 
      case "-": 
       result = value1 - value2; 
       break; 
      case "*": 
       result = value1 * value2; 
       break; 
      case "/": 
       result = value1/value2; 
       break; 
      case "%": 
       result = value1 % value2; 
       break; 
      default: 
       System.out.printf("ERROR: Illegal operator %s.", args[1]); 
       break; 
     } 

     System.out.printf("%d %s %d = %d", value1, args[1], value2, result); 
     //System.out.println(value1 + " " + args[1] + " " + value2 + " = " + result); 
    } 
} 
+1

Pourriez-vous essayer d'imprimer tous les arguments avant d'exécuter quoi que ce soit? –

+3

Ce n'est pas à propos de Java - c'est votre shell qui fait l'expansion des caractères génériques. Je suppose que vous avez deux ou plusieurs fichiers, dont l'un est appelé '002.java', dans le répertoire à partir duquel vous exécutez ce code. –

+0

J'ai essayé est juste maintenant avec le code suivant: 'pour (int i = 0; i

Répondre

6

* est un caractère générique qui a une signification spéciale pour le shell. Il est développé avant même d'être transmis au programme.

Dans votre cas, l'astérisque a été remplacé par le nom de tous les fichiers du répertoire, le premier semblant être 002.java. Essayer d'analyser cette chaîne en Integer entraîne l'exception donnée.

En l'entourant de guillemets "*", il est traité comme littéral par le shell et simplement transmis au programme tel quel. Selon le shell que vous utilisez, vous devriez également être en mesure d'échapper l'astérisque avec une barre oblique inverse \*.

Voir aussi Wikipedia article about glob patterns.