【Java】异常

1. Java的异常概念

1.1 异常体系结构

【Java】异常_第1张图片

从上图中可以看到:
  • 1. Throwable是异常体系的顶层类,其派生出两个重要的子类, Error Exception
  • 2. Error:指的是JVM无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型的代表:StackOverflowError和OutOfMemoryError,一旦出现,无法回天!
  • 3. Exception:异常产生后程序员可以通过代码进行处理,使得程序可以继续运行。

1.2 异常分类

编译时异常

  • 在编译期间发生的异常,称为编译时异常,也叫作受检查异常
  • 在编写代码的时候就需要进行处理,要么try catch 或者throws

2. 异常处理

2.1 防御式编程

  • 事前防御 -- if else 
    • 缺陷:正常流程和错误处理流程代码混合在一起,代码整体显的十分复杂
  • 事后认错 -- throw try catch
    • 优势:正常流程和错误流程是分离开的 , 程序员更关注正常流程,代码更清晰,容易理解代码

2.2 异常抛出 -- throw

如果程序中出现错误,此时就需要将错误的信息告知给调用者,比如:参数检测。
具体语法如下:
throw new XXXException ( " 异常产生的原因 " );
  1. throw必须写在方法内部;
  2. 抛出的对象必须是Exception 或者 Exception 的子类对象
  3. 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用出,直接交个JVM来处理。
  4. 如果抛出的编译时异常,用户必须处理,否则无法通过编译
  5. 异常一旦抛出,其后的代码就不会执行

2.3 异常的捕获 -- throws try-catch 

2.3.1 异常声明 throws

  • 当前方法不处理异常,提醒方法的调用者处理异常
语法格式:
修饰符 返回值类型 方法名 ( 参数列表 ) throws 异常类型 1 ,异常类型 2 ...{
}
  • 1. throws必须跟在方法的参数列表之后
  • 2. 声明的异常必须是 Exception 或者 Exception 的子类
  • 3. 方法内部如果抛出了多个异常,throws之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。
  • 4. 调用声明抛出异常的方法时,调用者必须对该异常进行处理,或者继续使用throws抛出

异常的处理方式

  • System.out.println(e.getMessage()); // 只打印异常信息
  • System.out.println(e); // 打印异常类型:异常信息
  • e.printStackTrace(); // 打印信息最全面

2.3.2 finally 关键字

异常会引发程序的跳转,可能 导致有些语句执行不到,finally就是用来解决资源回收问题的

注意: finally 中的代码一定会执行的,一般在 finally 中进行一些资源清理的扫尾工作。

3. 自定义异常类

需要的步骤:
  • 1. 自定义异常类,然后继承自Exception 或者 RunTimeException
  • 2. 实现一个带有String类型参数的构造方法,参数含义:出现异常的原因

注意:

  • 自定义异常通常会继承自 Exception 或者 RuntimeException
  • 继承自 Exception 的异常默认是受查异常
  • 继承自 RuntimeException 的异常默认是非受查异常.

你可能感兴趣的:(#,Java,java,开发语言)