我正在研究我的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
,这也是有意义的,因为有一个对的String对象的引用已经不再有意义了,因为应该是一个原因。args
中不存在
应该抛出哪个异常?
答案 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。