应抛出哪个例外?

时间:2017-07-18 15:16:21

标签: java exception-handling

背景

我正在研究我的Java杂志,准备参加Oracle Java 8考试,我遇到了令人费解的事情。我有一些基本的东西,假设有两个值作为参数传递:

public static void main(String[] args) {
    try {
        String val1 = args[0];
        String val2 = args[1];
        ...
    } catch (Exception e) { // <-- Here is where it gets tricky
        ...
    }
}

我意识到捕获Exception是不好的形式,但是,当我传入错误数据时,我会得到两个不同的特定异常,具体取决于我对通用Exception对象的处理方式,所以我不知道我需要抓住哪一个。

设置

如果我这样做:

} catch (Exception e) {
    System.err.println(e.toString());
}

我得到java.lang.ArrayIndexOutOfBoundsException,这是有道理的,因为args是一个数组。

但是,如果我改为:

} catch (Exception e) {
    System.err.println(e.getCause().getMessage());
}

我得到一个java.lang.NullPointerException这也是有意义的,因为有一个对args中不存在的String对象的引用已经不再有意义了,因为应该是一个原因。

问题

应该抛出哪个异常?

1 个答案:

答案 0 :(得分:1)

尝试修改下面的方法并逐步调试: -

public static void main(String[] args) {
    try {
        String val1 = args[0];
        String val2 = args[1];
    } catch (Exception e) { // <-- Here is where it gets tricky
        System.err.println(e.toString());
        Throwable thr = e.getCause();
        String msg = thr.getMessage();
        System.err.println(msg);
    }
}

try子句抛出的唯一异常是ArrayIndexOutOfBoundsException。

在catch子句中,您会发现e.getCause()返回null,因为ArrayIndexOutOfBoundsException没有其他因果异常。

因此,当您尝试在null原因上调用getMessage()时,会出现NullPointerException。