IllegalargumentExceptionを投げてキャッチするにはどうすればよいですか?
質問
だから基本的に、私は今私が私のAPコンプSCIクラスでやっているグリッドワールドプロジェクトを持っています。私はパックマンをやっています。 ACTメソッドの私のコードは次のとおりです(GridWorldに不慣れな人のために、ACTメソッドは、俳優が新しい動きをすることが期待されるたびに呼び出されます):
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";
}
}
}
ステートメントがBCである場合、最後の2つの奇妙な言葉遣いの理由は、パックマンに実際のゲームでテレポートできるようにしたいと考えています。ゲームを実行すると、約90%の時間が機能しますが、他の10%で違法なものを取得します。 )および(9,21))。これが起こらないようにするために、どのようにキャッチまたはスローできるか、何をする必要があるか知りたいです。私はキャッチやスローを使用したことがないので、あなたの推論の感謝を説明してみてください!
解決
例外をスローするには、キーワードを使用します throw
. 。キャッチするには、トライ /キャッチコンストラクトを使用します。詳細については、これを参照してください。
あなたの場合、あなたはこのようなことをするでしょう - これはテストケースです:
try {
throw new IllegalArgumentException("Threw an IllegalArgumentException");
} catch(IllegalArgumentException e) {
System.out.println("Caught an IllegalArgumentException..." + e.getMessage());
}
ただし、コードを調べて、IllegalargumentExceptionがとにかくスローされている理由を確認し、その部分を修正する必要があります。例外を使用して、トライ /キャッチを使用することです 予期しない イベントは、あなたが起こることを期待していて、より良い方法で処理できるイベントではありません。
例えば、 filenotfoundexception ファイルが見つからなかったときにスローされます。あなたは通常、それを試みる /キャッチするので、ファイルが見つからなかった場合に何かをするようにします。ただし、ファイルが存在しない可能性がある合理的な数のケースで予想される場合は、ファイルが存在するかどうかを最初に確認し、実際に何かを行うかどうかを確認する方が良いでしょう。
他のヒント
通常の例外をキャッチするのと同じ方法で、IllegalargumentExceptionをキャッチできます。通常、IAEはプログラムを無効にする状態から来ているため、負のインデックスを受け取った場合、それを同等の有効な値に変換する必要があります。プログラムがどのように機能するかという点では、通常、負のインデックス参照は良いことではありません。
ゲームを実行し続けるために例外をキャッチできるようになりたいと思うようで、パラメーターが間違っていることに満足しています。そのため、効果的に、プログラムの論理に例外を使用して、目的を打ち負かしています。
IllegalargumentExceptionはランタイムの例外です。それらをキャッチする必要はなく、プログラムは何らかの方法で失敗するはずです。渡されたパラメーターが正しいことを確認するだけです。
Googleで見つかった多くのチュートリアルのいずれかを使用して、簡単に例外をキャッチして投げることを学ぶことができます。
ただし、IllegalArgumentExceptionは、サードパーティAPIに送信しているパラメーターが間違っていることを意味します。アプリケーションをデバッグして、どのコードが問題を引き起こしているかを確認し、APIドキュメントをチェックして、壊れているパラメーターの要件/制約を確認して修正する必要があります。
もちろん、キャッチ(IllegalArgunentException E)を追加するだけで、それについては何もできません。プログラムは実行される可能性がありますが、後でクラッシュする可能性があります。