ArrayIndexOutOfBoundsException的自定义异常

时间:2011-05-23 09:51:18

标签: java exception

我有一个自定义异常扩展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");
                }

            }

ProblemscommandValue是枚举。
这是我的异常类:

public class CommandSyntaxException extends Exception {
    private String message;

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

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

是否有任何解决方法(除了捕捉Exception)? 我的意图是在单个catch子句中捕获我自己的异常所有异常。

2 个答案:

答案 0 :(得分:2)

当您扩展Exception并创建CommandSyntaxException时,它将成为特定的异常。现在你试图捕获CommandSyntaxException但是没有抛出异常,而ArrayIndexOutOfBound是线程,所以它不会被捕获。 如果您的代码抛出CommandSyntaxException,那么只会捕获它。 :)

快速解决这个问题可以有三种方式。 CommandSyntaxException扩展RuntimeException 或CommandSyntaxException扩展ArrayIndexOutOfBoundException。 或者您的代码抛出CommandSyntaxException。

“我的意图是在单个catch子句中捕获我自己的异常的所有异常”: 您可以使用Catch捕获所有异常(例外e)但是使用单个catch子句捕获所有异常并不是一个好习惯。

答案 1 :(得分:1)

添加

catch (ArrayIndexOutOfBoundsException e) {

}

告诉你。

ArrayIndexOutOfBoundExceptionCommandSyntaxException是不同的异常,如果你想捕获它们,你应该分别捕获每个异常或捕获它们共同祖先的异常(Exception)。

<强>更新 如果你现在想要捕获1个catch子句,你可以

  1. 等待java 7 http://www.baptiste-wicht.com/2010/05/better-exception-handling-in-java-7-multicatch-and-final-rethrow/
  2. 使您的CommandSyntax继承ArrayIndexOutOfBounds