首先,你先无视掉那个机器人的回答吧……
因为第3个catch捕获的Exception类是ArithmeticException的子类,而你的程序抛出的就是ArithmeticException类异常,那么在第1个catch语句捕获到的ArithmeticException类异常,同时也属于Exception类异常,也就是说Exception类异常已经被第1个catch语句捕获了,那么第3个catch语句自然是无异常可捕获了。打个比方,狩猎——假如你打到了一个兔子,别人问你有没有打到猎物,你不能说我打到的是兔子,不是猎物吧?同样的,ArithmeticException类异常,就属于Exception类异常。
想读懂这个try语句,你首先应该查一下JavaAPI文档,你先看一下你的3个catch语句捕获的3个异常类的继承关系:
所以,这个try语句先判断程序抛出的异常是否是ArithmeticException异常,如果是的话,下边2个catch语句就无异常可捕获了;再判断是不是除了ArithmeticException异常以外的RuntimeException异常,如果是的话,由第2个catch语句处理;如果还不是,判断是不是除了RuntimeException异常以外的Exception异常,是的话由第3个catch语句处理。
当然了,如果你就是想既输出ArithmeticException又输出Exception,你可以写在finally语句里;但如果你想这3个判断语句只要对都输出(3次都捕获),就1个finally语句显然不够,你可以先捕获父类Exception异常,再用instanceof判断是否为ArithmeticException异常或RuntimeException异常,代码如下: