顺序是 先匹配的,然后执行
(正如JLS清楚地解释的)。
如果第一个catch匹配到异常,则执行,否则,将尝试下一个,并不断重复直到匹配或不匹配。
因此,在捕获异常时,您总是要先捕获 最具体的
,然后再捕获最通用的(如RuntimeException或Exception)。例如,假设您想捕获String.charAt(index)方法抛出的
StringIndexOutOfBoundsException
,但是您的代码也可能抛出NullPointerException,这是捕获异常的方法:
String s = null;try { s.charAt(10);} catch ( NullPointerExeption e ) { System.out.println("null"); e.printStackTrace();} catch ( StringIndexOutOfBoundsException e ) { System.out.println("String index error!"); e.printStackTrace();} catch ( RuntimeException e ) { System.out.println("runtime exception!"); e.printStackTrace();}
因此,按照此顺序,我确保异常被正确捕获并且不会相互跳越,如果是 NullPointerException, 则进入第一个捕获,如果是
StringIndexOutOfBoundsException,
则进入第二个捕获,最后进入其他异常一个RuntimeException(或从它继承,如 IllegalArgumentException
)进入第三个捕获。
您的情况是正确的,因为IOException从Exception继承,并且RuntimeException也从Exception继承,因此它们不会彼此绊倒。
这也是一个编译错误,要先捕获一般异常,然后再捕获其后代之一,如下所示:
try { // some pre here} catch ( Exception e) { e.printStackTrace();} catch ( RuntimeException e ) { // this line will cause a compilation error because it would never be executed since the first catch would pick the exception e.printStackTrace();}
因此,您应该先有孩子,然后再有父母例外。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)