Java 异常教程

原文: https://javabeginnerstutorial.com/core-java-tutorial/java-exceptions/

Java 中的异常用于处理错误或程序正常流程中发生的任何其他异常事件。 在 Java 中可以通过多种方式发生异常。

  • 提供的数据不是预期的格式(例如int而不是String)。
  • 无法连接数据库。
  • 网络连接丢失。
  • 对象为空。
  • …..

Java 异常层次结构

Java 中的每个异常都是Exception类的子类型,而Exception类又是Throwable的子类。 正如我们所知道的,Java 中所有对象均来自Throwable对象类,也来自Object类。 异常和错误是从Throwable派生的两个不同的类。 错误代表的情况不是由于编程错误而发生,而是可能在程序执行时发生,这些都是 Java 程序无法处理且不应费心处理的异常行为。 JVM 内存不足是一种错误,可能在运行时发生。

受检与非受检异常

受检异常

  1. 受检异常Exception的子类,但RuntimeException及其子类除外。
  2. 受检异常强制程序员处理可能引发的异常。
  3. 当方法中发生受检异常时,该方法必须捕获异常并采取适当的措施,或者将异常传递给其调用方。

示例

IOException异常。

非受检异常

  1. 非受检异常RuntimeException及其任何子类
  2. 编译器不会强制程序员捕获非受检异常或在throws子句中声明它。
  3. 程序员甚至可能不知道会引发异常。
  4. 受检异常必须在编译时捕获。
  5. 运行时异常不是必需的。

示例

ArrayIndexOutOfBounds异常。

Java 异常处理

现在我们知道 Java 程序可以在任何时间(或任何位置)发生异常。 因此,我们需要知道如何处理这些异常。 处理异常是开发健壮的应用时必需的属性。 处理异常意味着在发生异常时将程序的执行转移到适当的处理器。 我们可以使用try-catch块来处理异常。

trytry用于定义可能发生异常的代码块。

catchcatch用于匹配特定类型的异常。 一个try块可能有多个catch子句。

finallyfinally确定将在try块之后始终执行的代码块。 即使在异常的情况下。

  1. try {
  2. throw new IOException();
  3. } catch (IOException e) {
  4. // Handle only IO Exception
  5. // This block will get executed only in case of IOException
  6. }catch (Exception e) {
  7. // Handle only all other type of exception
  8. // This block will get executed in case of all exception except IOException
  9. }finally{
  10. System.out.println("This block will get executed no matter exception occur or not");
  11. }

注意try子句不能没有catchfinally块而存在。 它们都是必需的。

异常传播

不需要处理catch块中try块引发的所有异常(因为它不是必需的块)。 如果catch块无法处理try块引发的异常,它将传播到调用此方法的方法中。 如果先前调用此方法的方法也无法处理该异常,则该异常将传播到方法栈中的最后一个方法,除非某些方法处理该异常,否则它将以相同的方式传播。 如果没有方法在调用栈中处理它,则异常将触底,而 JVM 将对其进行处理。

(感谢 Mohita 的建议)

备忘单

  • 受检非受检异常是两种类型的异常。
  • 受检异常是那些Exception类的子类型,但不包括扩展运行时异常的类。
  • 错误运行时异常的子类型属于非受检异常。
  • finally块将始终在所有条件下调用。
  • System.exit()是无法阻止finally块执行的唯一方法,在这种情况下,JVM 将关闭。
  • 还可以通过扩展Exception类来创建自定义异常。
  • Catch块应以最特殊到最一般的形式排序。 否则,编译器将报错无法访问的代码。

https://www.youtube.com/embed/bpHcP14Onp4?start=1&feature=oembed

https://www.youtube.com/embed/bYY6SWnMpz4?start=1&feature=oembed