2012-02-20 7 views
4

基本的に、私はAP Comp Sciクラスで今行っているGridWorld Projectを持っています。私はパックマンをやっている。ここではactメソッドのために私のコードです(GridWorldに慣れていない人のためには、actメソッドは、俳優が新しい動きを作ることが予想されるたびに呼ばれている):IllegalArgumentExceptionをスローしてキャッチするにはどうすればよいですか?

public void act() 
{ 
    Location loc = getLocation(); 

    if(direction==null) { 
    } 

    else if(direction.equals("NORTH")) { 
     Location next = loc.getAdjacentLocation(loc.NORTH); 
     if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) { 
      if(getGrid().get(next) instanceof Food) 
       addFood(); 
      moveTo(next); 
      direction = "NORTH"; 
     } 
    } 

    else if(direction.equals("SOUTH")) { 
     Location next = loc.getAdjacentLocation(loc.SOUTH); 
     if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) { 
      if(getGrid().get(next) instanceof Food) 
       addFood(); 
      moveTo(getLocation().getAdjacentLocation(getLocation().SOUTH)); 
      direction = "SOUTH"; 
     } 
    } 

    else if(direction.equals("EAST")) { 
     Location next = loc.getAdjacentLocation(loc.EAST); 
     if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) { 
      if(getGrid().get(next) instanceof Food) 
       addFood(); 
      moveTo(getLocation().getAdjacentLocation(getLocation().EAST)); 
      direction = "EAST"; 
     } 

     else if(getLocation().getCol()==20 && getLocation().getRow()==9) { 
      moveTo(new Location(9,0)); 
      direction = "EAST"; 
     } 
    } 

    else if(direction.equals("WEST")) { 
     Location next = loc.getAdjacentLocation(loc.WEST); 
     if(getGrid().isValid(next) && (getGrid().get(next)==null || getGrid().get(next) instanceof Food)) { 
      moveTo(getLocation().getAdjacentLocation(getLocation().WEST)); 
      direction = "WEST"; 
     } 

     else if(getLocation().getCol()==0 && getLocation().getRow()==9) { 
      moveTo(new Location(9,20)); 
      direction = "WEST"; 
     } 
    } 
} 

最後の二つで奇妙な言葉遣いの理由私はパックマンが実際のゲームでテレポートすることができるようにしたい。今私はゲームを実行すると、それは動作している時間の約90%が、他の10%で私はIllegalArgumentExceptionを取得するbcは、私はボード上にない場所に移動しようとしていると言う(例えば(9、-1 )および(9,21))。私はこのことが起こらないようにするために、どのように捕まえたり投げたりすることができるかを知りたい。私はキャッチやスローを使用したことがないので、あなたの推論のありがとうを説明しようとしてください!

答えて

5

例外をスローするには、キーワードthrowを使用します。 catchするには、try/catch構造を使用します。詳細については、これを参照してください: - :

try { 
    throw new IllegalArgumentException("Threw an IllegalArgumentException"); 
} catch(IllegalArgumentException e) { 
    System.out.println("Caught an IllegalArgumentException..." + e.getMessage()); 
} 

あなたは、しかし、見なければならないあなたのケースのために

は、あなたがこのような何かをしたい、これはテストケースでありますとにかくIllegalArgumentExceptionがスローされている理由を確認し、その部分を修正してください。例外とtry/catchを使用すると、予期しないイベントが発生しますが、発生する予定のイベントではなく、より良い方法で処理できます。

たとえば、ファイルが見つからなかった場合はFileNotFoundExceptionがスローされます。あなたは一般的にそれを試して/キャッチします。そうすれば、ファイルが見つからなければ何かをすることができます。しかし、合理的な数のケースでファイルが存在しないことが予想される場合は、まずファイルが存在するかどうかを確認し、実際にファイルで何かを行うかどうかを確認する方がよいでしょう。

+1

ありがとうございます!だから、私はあなたのアドバイスを取ったが、しばらく時間がかかりましたが、最終的に私が間違っていたところで見つけられ、ちょうどそれを修正しました。 –

+0

クール、最高のソリューションで終わった、あなたがそれを解決してうれしい! –

0

通常の例外を捕捉するのと同じ方法で、IllegalArgumentExceptionを捕捉できます。通常、IAEはプログラムを無効にする状態から来るので、負のインデックスを受け取った場合は、それを同等の有効な値に変換する必要があります。あなたのプログラムがどのように機能するのかという点では、通常、負のインデックス参照は良いことではありません。

0

あなたのゲームを実行し続けるために例外をキャッチし、パラメータが間違っていると満足しているように思えます。効果的には、プログラムのロジックに例外を使用して、目的を破っています。

IllegalArgumentExceptionは実行時の例外です。あなたはそれらをキャッチしてはならず、プログラムは何らかの方法で失敗するだけです。渡されたパラメータが正しいことを確認するだけです。

0

Googleで見つかった多くのチュートリアルの1つを使用して、例外を捕まえて簡単にスローする方法を学ぶことができます。

ただし、IllegalArgumentExceptionは、サードパーティAPIに送信しているパラメータの一部が間違っていることを意味します。アプリケーションをデバッグしてどのコードが問題を引き起こしているかを確認し、APIドキュメントを参照して、中断しているパラメータの要件/制約を確認して修正する必要があります。

もちろん、キャッチ(IllegalArgunentException e)を追加するだけで、それについては何もしないでください。あなたのプログラムは動作するかもしれませんが、後でクラッシュする可能性があります。

関連する問題