反常

1.反常的概念

Java中,将程序履行过程中产生的不正常行为称为反常。

1.1常见的反常

java中不同类型的反常,都有与其对应的类来进行描绘。

1. 算术反常

简单的理解

2. 数组越界反常

简单的理解

3. 空指针反常

简单的理解

1.2 反常的系统结构

反常种类繁复,为了对不同反常或许过错进行很好的分类管理,Java内部维护了一个反常的系统结构:

  1. Throwable:是反常系统的顶层类,其派生出两个重要的子类, Error 和 Exception
  2. Error: 指的是Java虚拟机无法处理的严重问题,比方:JVM的内部过错、资源耗尽等,典型代表:
    StackOverflowError和OutOfMemoryError,一旦产生回力乏术。
  3. Exception:反常产生后程序员可以经过代码进行处理,使程序持续履行。比方:感冒、发烧。我们平常所说
    的反常便是Exception。

简单的理解

2.反常的分类

反常可能在编译时产生,也可能在程序运行时产生,根据产生的时机不同,可以将反常分为:

    1. 编译时反常 : 在程序编译期间产生的反常,称为编译时反常,也称为受检查反常(Checked Exception)
    1. 运行时反常 : 在程序履行期间产生的反常,称为运行时反常,也称为非受检查反常(Unchecked Exception)

简单的理解

反常的捕获

反常的捕获,也便是反常的具体处理方式

反常的声明-Throws

处在办法声明时参数列表之后,当办法中抛出编译时反常,

用户不想处理该反常,此时就可以凭借throws将反常抛 给办法的调用者来处理。

语法

语法格局:

修饰符 返回值类型 办法名(参数列表) throws 反常类型1,反常类型2…{ }

简单的理解

【注意事项】

  1. throws有必要跟在办法的参数列表之后
  2. 声明的反常有必要是 Exception 或许 Exception 的子类
  3. 办法内部假如抛出了多个反常,throws之后有必要跟多个反常类型,之间用逗号隔开,假如抛出多个反常类型 具有父子关系,直接声明父类即可。

反常的捕获-try-catch

throws对反常并没有真实处理,而是将反常报告给抛出反常办法的调用者,由调用者处理。假如真实要对反常进行 处理,就需求try-catch。

语法

语法格局:
try{
    // 将可能出现反常的代码放在这儿
}catch(要捕获的反常类型 e){
    // 假如try中的代码抛出反常了,此处catch捕获时反常类型与try中抛出的反常类型共同时,或许是try中抛出反常的基类
    时,就会被捕获到
    // 对反常就可以正常处理,处理完成后,跳出try-catch结构,持续履行后序代码
}[catch(反常类型 e){
    // 对反常进行处理
}finally{
    // 此处代码一定会被履行到
}]
// 后序代码
// 当反常被捕获届时,反常就被处理了,这儿的后序代码一定会履行
// 假如捕获了,由于捕获时类型不对,那就没有捕获到,这儿的代码就不会被履行

实例一

简单的理解

实例二

同时捕获多个反常可以用“|”。

简单的理解

finally

在写程序时,有些特定的代码,不论程序是否产生反常,都需求履行,比方程序中打开的资源:网络衔接、数据库 衔接、IO流等,在程序正常或许反常退出时,有必要要对资源进进行收回。别的,由于反常会引发程序的跳转,可能导致有些句子履行不到,finally便是用来处理这个问题的。

语法格局:
try{
// 可能会产生反常的代码
}catch(反常类型 e){
// 对捕获到的反常进行处理
}finally{
// 此处的句子不管是否产生反常,都会被履行到
}
// 假如没有抛出反常,或许反常被捕获处理了,这儿的代码也会履行

实例

public static void main(String[] args) {
try{
int[] arr = {1,2,3};
arr[100] = 10;
arr[0] = 10;
}catch (ArrayIndexOutOfBoundsException e){
System.out.println(e);
}finally {
System.out.println("finally中的代码一定会履行");
}
System.out.println("假如没有抛出反常,或许反常被处理了,try-catch后的代码也会履行");
}

finally 和 try-catch-finally 后的代码都会履行,那为什么还要有finally呢?

finally中的代码一定会履行的,一般在finally中进行一些资源整理的扫尾工作。