Java中的异常处理机制

Java中的异常处理机制

    • 异常处理体系
      • 异常架构
    • 异常(Exception)类型
      • 运行时异常
      • 编译时异常
      • 受检异常与非受检异常
    • 异常关键字
    • 异常的基本用法
      • 声明异常
      • 抛出异常
      • 捕获异常
    • 异常处理流程

异常处理体系

异常架构

Java中的异常处理机制_第1张图片

  • 顶层Throwable派生出两个重要的子类,Error和Exception。
  • Error指的是Java运行时内部错误和资源耗尽错误,应用程序不抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序终止之外,再无能为力,这种情况很少出现。
  • Exception是所有异常类的父类,是指程序本身可以捕获并且处理的异常。
  • 其中Exception有一个子类称为RuntimeException,这里面又派生出很多常见的异常类NullPointerException,IndexOutOfBoundsException等。

异常(Exception)类型

Exception异常可分为两类:运行时异常和编译时异常

运行时异常

定义:RuntimeException类及其子类,表示JVM在运行期间可能出现的异常
举例:NullPointerException(空指针异常)
ArrayIndexOutOfBounds(数组下标越界异常)
ClassCastException(类型转换异常)
ArithmeticException(算术异常)

编译时异常

定义:Exception中除RuntimeException及其子类之外的异常。
举例:ClassNotFoundException(没有找到指定类异常)
IOException(IO流异常)

受检异常与非受检异常

受检异常
除RuntimeException及其子类之外,其他的Exception异常
非受检异常
派生于 Error 类或 RuntimeException 类的所有异常

异常关键字

try:用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。

catch:用于捕获异常。catch用来捕获try语句块中发生的异常。

finally:finally语句块总是会被执行。它主要用于回收在try里打开的物力资源。只有finally块执行完成之后才会回来执行try或者catch中的return或throw语句,如果finally中使用了return或throw等终止方法的语句,则就不会跳回执行,直接停止。

throw:用于抛出异常。

throws:用在方法签名中,用于声明该方法可能抛出的异常。

异常的基本用法

声明异常

在方法签名处使用throws关键字声明可能会抛出的异常
注意
1.非受检异常不可使用throws关键字来声明要抛出的异常;
2.一个方法出现编译时异常,就需要try-catch/throws处理,否则会导致编译错误。

抛出异常

任何Java代码都可以通过throw语句在方法内部抛出一个Throwable类型的异常。

捕获异常

基本语法

try{
有可能出现异常的语句 ;
}[catch (异常类型 异常对象) {
} ... ]
[finally {
异常的出口
}]
  • 不处理异常
int[] arr = {1, 2, 3};
System.out.println("before");
System.out.println(arr[100]);
System.out.println("after");
// 执行结果
before
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
  • 使用try-catch之后的程序执行过程
int[] arr = {1, 2, 3};
try {
System.out.println("before");
System.out.println(arr[100]);
System.out.println("after");
} catch (ArrayIndexOutOfBoundsException e) {
// 打印出现异常的调用栈
e.printStackTrace();
}
System.out.println("after try catch");
// 执行结果
before
java.lang.ArrayIndexOutOfBoundsException: 100
at demo02.Test.main(Test.java:10)
after try catch

注意
1.catch只能处理对应种类的异常
2.catch可以有多个
3.可以用一个catch捕获多个异常(所有异常的父类Exception)
4.无论是否出现异常,finally部分的语句都会执行
5.使用try负责回收资源

异常处理流程

  • 程序先执行try中的代码
  • 如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常是否匹配
  • 如果找到匹配的异常类型,就会执行catch中的代码
  • 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
  • 无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束前执行)
  • 如果上层调用者也没能处理异常,就继续向上传递
  • 一直到main方法也没有合适的代码处理异常,就会交给JVM来处理,此时程序就会异常终止

你可能感兴趣的:(Java)