一、其中各个类的含义如下:
Throwable:异常的基类,所有异常都继承自 java.lang.Throwable 类,Throwable 类有两个直接子类:Error 类和 Exception 类。
Error:是 Java 应用程序本身无法恢复的严重错误,应用程序不需要捕 获、处理这些严重错误。通常情况下,程序员无需处理此类异常。
Exception:由 Java 应用程序抛出和处理的非严重错误(即异常),也 是我们本章重点学习的对象。异常可分为运行时异常 (RuntimeException)和检查时异常(CheckedException)两种。
RuntimeException:运行时异常,即程序运行时抛出的异常,程序员在 编程时即使不做任何处理,程序也能通过编译。前面数组下标越界异常 和除数为 0 的异常都是运行时异常。
CheckedException:检查时异常,又称为非运行时异常,这样的异常要 求程序员必须在编程时进行处理,否则就会编译不通过。需要特别注意 的是,在 JDK 的异常定义体系中(即在所有 Throwable 的子类中), 并不存在真正的 CheckedException 类。也就是说,上图中的所有类 名,都能在 JDK 中找到对应的 API,但唯独 CheckedException 类并不 是真实存在的。一般而言,如果一个类继承自 RuntimeException,就称 此类为运行时异常;反之,如果一个类没有继承 RuntimeException,但 继承了 Exception 或 Throwable,就称此类为检查时异常
➢ 运行时异常:代码在编辑(编译阶段)时不报错,运行时才报错。
➢ 检查异常:代码在编辑(编辑阶段)时报错,在编辑时,必须处理
二、异常处理的两种方式
具体而言,Java 对异常的处理有以下两种方式:try catch 或者 throws
1. 捕获异常并处理:先在一段可能抛出异常的代码外,用 try{...}catch{...} 结构包裹起来。如果运行时发生了异常,那么此次 异常就会进入 catch{...} 代码块;如果一直没有异常发生,程序就不 会进入 catch{...} 代码块。并且 catch{...} 可以针对抛出的不同类 型的异常捕获后进行分类处理。
2. 抛出异常:通过 throws 关键字,将异常抛给上一级处理。
➢ Try:将可能发生异常的代码用{}包裹起来
➢ Catch:捕获特定类型的异常
try {
...
} catch (ArrayIndexOutOfBoundsException e) { //捕获数组下标越界异常
...
} catch (ArithmeticException e) { //捕获算数异常
...
} catch (Exception e) { //捕获其余所有类型的异常,类似于 swtich 结构中的
default
...
}catch (RuntimeException e) { //捕获运行时异常
System.out.println("发生运行时异常,成功捕获!");
}finally {
System.out.println("显示完毕!");
}
三、Finally
finally 语句块,保证无论是否发生异常,finally 语句块中的代码总被执行,在异常处 理结构中,finally 语句块不执行的唯一一种情况就是如果在 catch 语句中出现 System.exit(1),该方法表示关闭 JVM。直接退出 JVM
从继承关系上来说,数组下标越界异常ArrayIndexOutOfBoundsException 是运行时异 常 RuntimeException 的子类,而运行时异常 RuntimeException 又是 Exception 异常的 子类,在捕获异常的时候,应该按照“从小到大”的顺序捕获异常(小范围到大范围),这样 才能保证逐层捕获。将上面的代码调整为先捕获数组下标越界异常 ArrayIndexOutOfBoundsException,再捕获运行时异常 RuntimeException,最后,为了防 止遗漏对某个异常的处理,一般建议在最后用 catch (Exception e) 捕获剩余的异常。
➢ 即使遇到 return,也仍然会执行 finally
➢ 除非虚拟机关闭,才不会执行 finally
四、throw 和 throws 的区别
-
throw关键字手动抛出一个异常;throw位于方法体内部,可作为单独语句使用;throw抛出一个异常对象,只能是一个。
-
throws 用于将异常提交给该方法的调用出进行处理;throws位于方法参数列表的后面,不能单独使用;throws后面跟异常类,可以跟多个。
五、常见的异常
-
1、NullPointerException 空指针异常属于运行时异常 就是调用了未经初始化的对象或者不存在的对象
-
2、ClassNotFoundException 该异常为类没能找到的异常
-
出现这种情况一般有三种原因
-
一是的确不存在该类;
-
二是开发环境进行了调整
-
三是在修改类名时,没有修改调用该类的其他类,导致类找不到的情况
-
-
-
3、IllegalArgumentException 抛出该异常表明向方法传递了一个不合法或不正确的参数
-
4、InputMismatchException 由 Scanner 抛出,表明 Scanner 获取的内容与期望类 型的模式不匹配,或者该内容超出期望类型的范围
-
5、ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常
-
6、SQLException 提供关于数据库访问错误或其他错误信息的异常
-
7、IOException 当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类
支持:如果你觉得博主的文章的不错或者对你有帮助,可以点一个免费的关注支持一下博主,你的鼓励将是我创作的最大动力!!!