Как бросить и поймать исключение IllegalArgumentException? - PullRequest
4 голосов
/ 21 февраля 2012

Так что в основном у меня есть проект GridWorld, который я сейчас делаю в своем классе AP Comp 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";
        }
    }
}

Причина странной формулировки в последних двух утверждениях if bc. Я хочу, чтобы Pacman мог телепортироваться в реальной игре. Теперь, когда я запускаю игру, примерно в 90% случаев она работает, но в остальные 10% я получаю исключение IllegalArgumentException, в котором говорится, что я пытаюсь перейти в место, которого нет на доске (например, (9, -1 ) и (9,21)). Я хочу знать, как я могу поймать или бросить или что мне нужно сделать, чтобы этого не случилось. Я никогда не использовал catch или throw, поэтому, пожалуйста, попробуйте объяснить ваши аргументы, спасибо!

Ответы [ 4 ]

5 голосов
/ 21 февраля 2012

Чтобы вызвать исключение, вы используете ключевое слово 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 генерируется, когда файл не может быть найден.Как правило, вы пытаетесь / поймать это, так что вы делаете что-то, если файл не был найден.Однако, если в разумном числе случаев ожидается, что файл может отсутствовать, было бы лучше сначала проверить, существует ли файл, а затем, действительно ли он что-то с ним делает.

0 голосов
/ 21 февраля 2012

Вы можете легко научиться ловить и генерировать исключения с помощью одного из множества учебных пособий, найденных в Google.

Однако, IllegalArgumentException означает, что какой-то параметр, который вы отправляете стороннему API, неверен. Вы должны отладить свое приложение и посмотреть, какой код вызывает проблему, проверить документацию API, чтобы увидеть требования / ограничения параметров, которые вы нарушаете, и исправить это.

Конечно, вы можете только добавить улов (IllegalArgunentException e) и ничего не делать с ним. Ваша программа может быть запущена, но, возможно, она может потерпеть крах позже.

0 голосов
/ 21 февраля 2012

Кажется, вы хотите иметь возможность перехватывать исключения, чтобы ваша игра работала, и вы довольны ошибочными параметрами. Так эффективно вы используете исключения в логике программы, побеждая их назначение.

IllegalArgumentException - исключение времени выполнения, вы не должны перехватывать их, и программа должна каким-то образом просто не работать. Просто убедитесь, что переданные параметры верны.

0 голосов
/ 21 февраля 2012

Вы можете перехватить IllegalArgumentException так же, как вы ловите обычное исключение.Обычно IAE происходит из состояния, которое делает вашу программу недействительной, поэтому, если вы получаете отрицательный индекс, вам необходимо преобразовать его в его эквивалентное допустимое значение.С точки зрения того, как ваша программа предназначена для работы, обычно отрицательная ссылка на индекс не очень хорошая вещь.

...