如果我没记错的话,应该首先捕获异常的子类。但是必须捕获任何 RuntimeException 和一个具体的检查异常,首先应该捕获?
try {
...
} catch(RuntimeException e) {
...
} catch(IOException e) {
...
}
这个订单是正确的吗?还是正确但不好的选择?
最佳答案
顺序是先匹配,然后执行(as the JLS clearly explains)。
如果第一个 catch 与异常匹配,则执行,如果不匹配,则尝试下一个并不断尝试,直到有一个匹配或没有匹配。
因此,在捕获异常时,您希望始终先捕获最具体的,然后再捕获最通用的(如 RuntimeException 或 Exception)。例如,假设您想捕捉 StringIndexOutOfBoundsException 由String.charAt(index) 抛出方法,但您的代码也可能抛出 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 code 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();
}
因此,您应该先拥有 child ,然后再拥有 parent 异常(exception)。
关于java - Java中捕获异常的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964882/