6

問題は簡単ですが、ここでは非常に基本的なものがいくつか見逃されています。助けてください。 私はコマンドラインで作業する簡単な電卓プログラムを書いています。ソースコードを以下に示します。私はJavaプログラムのコマンドラインで*を使用する

>java SwitchCalc 12 * 5 

として計算機を使用する場合 は、問題はそれが入力された文字列のための「java.lang.NumberFormatException」をスローされます。引数から2番目のintを解析文で「002.java」[2]:

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

その後、私は次のように試してみました。

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

何が欠けていますか?

/* 
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

何かを実行する前に、すべてのargsを印刷してみることができますか? –

+3

これはJavaでは関係ありません。あなたのシェルはワイルドカード拡張を行っています。私はあなたがこのコードを実行しているディレクトリに '002.java'と呼ばれるファイルが2つ以上あると思います。 –

+0

次のコードを試しました: 'for(int i = 0; i

答えて

6

*シェルに対して特別な意味を持つワイルドカードです。プログラムに渡される前に展開されます。あなたのケースでは

、アスタリスクは002.javaのようだ最初のうち、ディレクトリ内のすべてのファイルの名前に置き換えられました。この文字列を解析してIntegerにすると、例外が発生します。

"*"の引用符で囲むことで、シェルによってリテラルとして扱われ、そのままプログラムに渡されます。使用しているシェルによっては、アスタリスクを\*バックスラッシュでエスケープできる必要があります。

Wikipedia article about glob patternsも参照してください。