4

つまり、基本的には、AP Comp Sci クラスで現在行っている GridWorld プロジェクトがあります。パックマンやってます。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";
        }
    }
}

最後の 2 つの if ステートメントの奇妙な言い回しの理由は bc です。パックマンが実際のゲームでテレポートできるようにしたいのです。ゲームを実行すると、約 90% の時間で動作しますが、残りの 10% では IllegalArgumentException bc が発生し、ボード上にない場所に移動しようとしていることが示されます (例: (9,-1 ) および (9,21))。どうすれば捕まえたり投げたりできるか、またはこれを防ぐために必要なことは何でも知りたい. 私はキャッチやスローを使ったことがないので、あなたの理由を説明してみてください。

4

4 に答える 4

5

例外をスローするには、キーワードを使用しますthrow。キャッチするには、try / catch コンストラクトを使用します。詳細については、これを参照してください。

あなたの場合、次のようにします - これはテストケースです:

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

ただし、コードを調べて IllegalArgumentException がスローされる理由を確認し、その部分を修正する必要があります。例外と try / catch を使用するのは、予想外のイベントに対するものであり、発生が予想され、より適切な方法で処理できるイベントではありません。

たとえば、ファイルが見つからない場合、 FileNotFoundExceptionがスローされます。通常、ファイルが見つからない場合に何かを行うために、それを試したりキャッチしたりします。ただし、妥当な数のケースでファイルが存在しないことが予想される場合は、最初にファイルが存在するかどうかを確認し、次に実際にファイルに対して何かを行うかどうかを確認することをお勧めします。

于 2012-02-20T22:09:11.700 に答える
0

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

于 2012-02-20T22:06:19.913 に答える
0

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

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

于 2012-02-20T22:12:44.190 に答える
0

Google にある多くのチュートリアルの 1 つを使用して、例外をキャッチしてスローする方法を簡単に学ぶことができます。

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

もちろん、catch (IllegalArgunentException e) を追加するだけで、何もできません。プログラムは実行されるかもしれませんが、後でクラッシュする可能性があります。

于 2012-02-20T22:16:08.403 に答える