java - Java中捕获异常的顺序

标签 java exception

如果我没记错的话,应该首先捕获异常的子类。但是必须捕获任何 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/

相关文章:

访问列表元素时出现 Java ConcurrentModificationException

java - Autocloseable 类不调用默认关闭方法

c# - 如何处理来自 C# 的非托管 Win32 异常

java - 通知在特定时间自动取消

java - 正则表达式问题 - 排除某些字符

java - 如何在java的if语句中使用Jbutton

java - Jersey HTTP 服务器 : Add parameters to every http method

java - 使用 Xuggle 将 Flv 视频转换为 mp4?

java - 尝试在 Android Studio 中运行程序但出现错误,提示我的应用已停止工作

java - 在 java 中,有没有办法确保在 finally block 中调用多个方法?