Пользовательское исключение для ArrayIndexOutOfBoundsException - PullRequest
0 голосов
/ 23 мая 2011

У меня есть пользовательское исключение, расширяющее Exception, однако оно, похоже, не перехватывает ArrayIndexOutOfBoundsException. Но если я вместо этого изменю предложение catch на Exception, оно будет работать как положено.

Разве исключение суперкласса не должно перехватывать исключение подкласса, даже если оно RuntimeException?

Вот причина исключения:

int timeInMillis = 0;

    for (int i = 0; i < commandMessage.length; i++)
        for (String commandValue : command.getArguments()) {
            try {
                if (commandValue.equals(commandMessage[i]))

                    // This is causing it.
                    timeInMillis =
                        Integer.parseInt(commandMessage[i + 1]);
                    else
                        throw new CommandSyntaxException(Problems.
                                SYNTAX_ERROR.getProblemDescription());
                } catch (CommandSyntaxException commandSyntaxException) {
                    System.out.println("foo");
                }

            }

Problems и commandValue являются перечислениями.
И вот мой класс исключений:

public class CommandSyntaxException extends Exception {
    private String message;

    public CommandSyntaxException(String message) {
        this.message = message;
    }

    @Override
    public String getMessage() {
        return message;
    }
}

Есть ли обходной путь (кроме перехвата Exception)? Мое намерение состоит в том, чтобы перехватить все исключения с моим собственным исключением в одном предложении catch.

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Когда вы расширяете Exception и создаете CommandSyntaxException, оно становится конкретным исключением. И теперь вы пытаетесь перехватить CommandSyntaxException, но это исключение не выдается, а ArrayIndexOutOfBound является потоком, поэтому оно не будет перехвачено. Если ваш код генерирует CommandSyntaxException, то только он будет перехвачен. :)

Быстро исправить эту проблему можно тремя способами. CommandSyntaxException расширяет RuntimeException Или CommandSyntaxException расширяет ArrayIndexOutOfBoundException. Или ваш код вызывает исключение CommandSyntaxException.

«Мое намерение состоит в том, чтобы перехватить все исключения, за исключением моего собственного, в одном предложении catch»: Вы можете перехватить все исключения, используя Catch (Exception e), но перехват всех исключений одним предложением catch не является хорошей практикой.

1 голос
/ 23 мая 2011

Добавьте

catch (ArrayIndexOutOfBoundsException e) {

}

к вашим операторам перехвата.

ArrayIndexOutOfBoundException и CommandSyntaxException - это разные исключения, и если вы хотите перехватить их оба, вы должны либо перехватить каждое исключение отдельно, либоисключение catch, являющееся их общим предком (Exception).

Обновление Если вы теперь хотите поймать 1 предложение catch, вы можете

  1. дождаться Java7 http://www.baptiste -wicht.com / 2010/05 / лучше-обработка исключений в java-7-multicatch-and-final-rethrow /
  2. Сделайте ваш CommandSyntax преемникомArrayIndexOutOfBounds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...