Java 异常教程
原文: https://javabeginnerstutorial.com/core-java-tutorial/java-exceptions/
Java 中的异常用于处理错误或程序正常流程中发生的任何其他异常事件。 在 Java 中可以通过多种方式发生异常。
- 提供的数据不是预期的格式(例如
int
而不是String
)。 - 无法连接数据库。
- 网络连接丢失。
- 对象为空。
- …..
Java 异常层次结构
Java 中的每个异常都是Exception
类的子类型,而Exception
类又是Throwable
的子类。 正如我们所知道的,Java 中所有对象均来自Throwable
对象类,也来自Object
类。 异常和错误是从Throwable
派生的两个不同的类。 错误代表的情况不是由于编程错误而发生,而是可能在程序执行时发生,这些都是 Java 程序无法处理且不应费心处理的异常行为。 JVM 内存不足是一种错误,可能在运行时发生。
受检与非受检异常
受检异常
- 受检异常是
Exception
的子类,但RuntimeException
及其子类除外。 - 受检异常强制程序员处理可能引发的异常。
- 当方法中发生受检异常时,该方法必须捕获异常并采取适当的措施,或者将异常传递给其调用方。
示例
IOException
异常。
非受检异常
- 非受检异常是
RuntimeException
及其任何子类。 - 编译器不会强制程序员捕获非受检异常或在
throws
子句中声明它。 - 程序员甚至可能不知道会引发异常。
- 受检异常必须在编译时捕获。
- 运行时异常不是必需的。
示例
ArrayIndexOutOfBounds
异常。
Java 异常处理
现在我们知道 Java 程序可以在任何时间(或任何位置)发生异常。 因此,我们需要知道如何处理这些异常。 处理异常是开发健壮的应用时必需的属性。 处理异常意味着在发生异常时将程序的执行转移到适当的处理器。 我们可以使用try-catch
块来处理异常。
try
:try
用于定义可能发生异常的代码块。
catch
:catch
用于匹配特定类型的异常。 一个try
块可能有多个catch
子句。
finally
:finally
确定将在try
块之后始终执行的代码块。 即使在异常的情况下。
try {
throw new IOException();
} catch (IOException e) {
// Handle only IO Exception
// This block will get executed only in case of IOException
}catch (Exception e) {
// Handle only all other type of exception
// This block will get executed in case of all exception except IOException
}finally{
System.out.println("This block will get executed no matter exception occur or not");
}
注意:try
子句不能没有catch
或finally
块而存在。 它们都是必需的。
异常传播
不需要处理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