2009-06-12 7 views
0

こんにちは私は簡単なJavaの練習に立ち往生しています。java main args []配列エラーの解析

申し訳ありませんが、これは本当にシンプルな場合は、私はJava初心者です。ユーザーは、このような「foo」というように「ヘルプ」以外の文字列を入力した場合、私は次のエラーを取得する:

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) 

何が起こっていると思う:「FOO私はとのトラブルを抱えている何

args [0]はオブジェクト参照であり、実際には文字列ではないため、 "else"によって捕捉されていません。

私が知りたいこと:「ヘルプ」または数字「1」から「5」以外のものをすべてキャッチする方法は?あなたは正しくエラーを表していない文字列を解析しようとした場合parseIntは例外を発生させ、気づいてきたようにここで

は、コード...

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

もっと複雑な引数解析については、私はcommons-cliを提案したいと思います。 – KitsuneYMG

答えて

3

プログラムロジックは、引数ゼロは 『ヘルプ』でない場合、整数&hellipとしてそれを解析」、本質的です。 "その時点で、" foo "は有効な整数ではないため、例外がスローされます。

最も簡単な方法は、NumberFormatExceptionをキャッチしてより有用なメッセージを出力することです。ここで何が起こっている

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

ありがとうございました:) とありがとうございました。 –

0

です。 try/catchは、そのような例外をキャッチしてそれらを処理するためのJavaのコンストラクタです。あなたの好きなJavaドキュメントでそれを調べてください!

+1

実際にJavaでtry/catchを実行しています。 –

+0

おっと、ありがとうございます@ mmyers、これを修正するための回答を編集! –

1

「ヘルプ」を探しているが、数としてそれを解析しようとされた後、それが最初に行うこと:

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

何をしようとすることができることにその行を変更することにより、この例外をキャッチしています

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

あなたは「FOO 1」のようなパラメータを受け入れることを意味している場合、あなたは引数を解析する必要があります[1]、とargs [0]あなたはそれがこのような「foo」というのですかどうかを確認するためにテストする必要があります

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

ああ、ところで。ほとんどの言語の「ランダムな」数字は0と1の間の数字です。一般的には「.108937190823 ...」のように見えます。

1-10のような数字をチェックする場合は、 :。

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

(それはそれを行うには正しい方法ですが、それは近いです全くわからない

+0

正しい方法は、java.util.Randomオブジェクトを作成し、nextInt(10)を呼び出すことです。これは[0,9]の範囲にintを与えます。これで1を加えることができます。 –

+0

@ mmyersありがとう! Javaの多くを無作為に混乱させてはいけません。 –

+0

nextInt(int)で使用されるアルゴリズムの説明については、http://java.sun.com/docs/books/effective/excursion-random.htmlを参照してください。それは本当にかなり関わっている。 –

1

は(あなたが推測される)コードが他のブロックに入るとすぐに、他のブロックは番号(Integer.parseInt(argsを[0])にパラメータを変換しようとしていることです。

パブリッククラスのnumberguess {

公共の静的な無効メイン(文字列の引数[]){

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

    }}} 

:だから、あなたはこのようなシナリオを処理するためのtry catchブロックを追加することができますコードを書くことができる方法の1つです(単なる提案です)。

関連する問題