异常是发生在程序执行过程中, 阻碍程序正常执行的错误事件。

只要在Java语句执行中产生了异常,一个异常对象就会被创建,JRE就会试图寻找异常处理程序来处理异常。如果有合适的异常处理程序,异常对象就会被异常处理程序接管,否则,将引发运行环境异常,JRE终止程序执行。

image.png

1. Error

  1. Error 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果
    出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。

    2. Exception

    Exception 又有两个分支 ,一个是运行时异常 RuntimeException ,一个是CheckedException

    2.1 RuntimeException 运行时异常 (不可查的异常)

    如 : NullPointerException 、 ClassCastException
    RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 如果出现 RuntimeException,那么一
    定是程序员的错误

    2.2 CheckedException 非运行时异常(检查异常)

    IOException、SQLException等以及用户自定义的Exception异常
    一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强
    制程序去捕获此类异常,即会出现要求你把这段可能出现异常的程序进行 try catch,该类异常一
    般包括几个方面:
    1. 试图在文件尾部读取数据
    2. 试图打开一个错误格式的 URL
    3. 试图根据给定的字符串查找 class 对象,而这个字符串表示的类并不存在

Throw 和 throws 的区别:

位置不同
1. throws 用在函数上,后面跟的是异常类,可以跟多个;而 throw 用在函数内,后面跟的是异常对象。
功能不同:
2. throws关键字用于指定一个方法可以在其执行过程中产生异常。它在调用方法时强制执行显式异常处理
3. throw关键字允许我们抛出一个异常对象中断程序的正常流动。
执行 throw 则一定抛出了某种异常对象。
4. 两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

异常和错误有什么区别?

异常是表示可以恢复的事件,而错误表示通常无法从中恢复的意外情况。
JVM抛出的所有错误都是Error或其子类之一,更常见的包括但不限于:

  • OutOfMemoryError - 当JVM因内存不足而无法分配更多对象时抛出,而垃圾收集器无法提供更多可用内容
  • StackOverflowError - 当线程的堆栈空间用完时发生,通常是因为应用程序过于冗长
  • ExceptionInInitializerError - 表示在评估静态初始化程序期间发生意外异常
  • NoClassDefFoundError - 当类加载器尝试加载类的定义但无法找到它时抛出,通常是因为在类路径中找不到所需的类文件
  • UnsupportedClassVersionError - 当JVM尝试读取类文件并确定文件中的版本不受支持时发生,通常是因为该文件是使用较新版本的Java生成的

虽然可以使用try语句处理错误,但这不是推荐的做法,因为无法保证程序在抛出错误后能够可靠地执行任何操作。

异常继承关系

当父类方法不抛出任何异常时,子类方法不能抛出任何已检查的异常,但它可能会抛出任何未检查的异常。


参考链接:
https://www.jianshu.com/p/eccd204ddc22