异常处理
- Throwable : 所有异常和错误(不包含语法错误)的父类。
- Error (错误)
- Exception (异常)
Error
错误是编程中非常严重的问题,错误的出现 往往开发人员是无能为力的、错误往往不是因为编程所导致的。
可能是因为 外部资源、外部环境 等各种因素造成的 无法由编程解决的问题。
Exception
异常 往往是由于 程序的不严谨 导致产生的问题 ,往往异常都是可以由开发人员通过优化代码方式处理的。
Exception异常的种类
-
编译时异常(已检查异常) Exception :要求异常必须在编译阶段进行处理
- ParseException : 解析异常
- FileNotFoundException : 文件找不到异常
- ClassNotFoundException : 类找不到异常
- IOException : 流异常
- SQLException : 数据库异常
-
运行时异常(未检查异常) RuntimeException :异常 可处理 可不处理
- NullPointException : 空指针异常
- ArrayIndexOutOfBoundsException : 数组索引越界异常
- IndexOutOfBoundsException : 索引越界异常
- ClassCastException : 类型转换异常
- ArithmeticException : 算术异常
处理异常
- 在声明方法的时候使用 throws 抛出异常
是一种异常的伪处理、异常所在的方法不处理该异常,处理异常的位置由调用者进行处理.
throws 可以声明抛出 具体的某一个异常,或者异常的父类,也可以同时声明抛出多个异常类型 。
- try-catch
try {
// 可能产生异常的代码
}catch(Exception e){
// 针对捕获的异常提供解决方案
}
是一种真正意义上的异常处理、是一种当异常发生的时候,怎么解决的 处理方案 。
try 后面紧跟一个代码块 ,将 可能会发生异常的代码 写入到 此代码块中。尝试捕获代码中产生的异常
catch(e){} : 用来捕获指定的异常,并编写针对该异常的解决方案。
catch可以定义多个,用来处理不同类型的异常、但如果多个异常之间存在父子关系,则必须让子类异常优先处理
- try-catch-finally
try{
}catch(Exception e) {
}finally{
// 程序进入try之后,无论 代表是否产生异常, 都会被执行的代码
一般用来 释放资源 、关闭链接
}
正常来说,只要程序进入try,就一定会执行finally, 如果在try中执行了System.exit(0)方法,则不会执行finally
try-finally 结构
try-finally 结构不是为了处理异常,而是为了释放资源
try-with-resource 结构
try(声明对象(可以自动释放的对象)) {
}catch(Exception e){
}
是 对 try-finally 结构的一种特殊用法,是JDK 7 新增的特性, 该接口可以配合 catch完成异常处理。
try 小括号中 只能声明定义 实现 Closeable 接口的类 的对象
面试题 : final, finally , finalize 有什么区别?
- final 是一个修饰符,可以用来修饰 类、属性、方法、局部变量!
- finally 是和 try 进行配合使用,主要用来 释放资源
- finalize 是 Object类中的方法,是用来回收垃圾的,垃圾的回收由 GC守护线程负责回收,一般情况下不推荐用户重写该方法。
强引用、软引用、弱引用、虚引用
强引用
大部分的引用都采用的是强引用,标准写法是 T obj = new T(); 强引用的对象只有被标记为0引用的时候,才会被GC进行垃圾回收
如果非零引用,即使 内存溢出,也不会回收该对象。
软引用
当内存不足的时候,会将软引用指向的对象 回收。
弱引用
无论内存是否足够、只要调用 gc ,都会被进行回收 ~
虚引用
无论什么时候从虚引用中获取对象,都返回的是 null, 可以作为一种标记
自定义异常
定义一个类、继承已知的异常类、那么这个类就是 自定义异常类 !
如果 希望 自定义的异常是 编译时异常,那么 继承 Exception 即可 ~
如果 希望 自定义的异常是 运行时异常,那么 继承 RuntimeException 即可 ~
单元测试 Junit 5
依赖的包
- apiguardian-api-1.1.2.jar
- junit-jupiter-api-5.9.2.jar
- junit-platform-commons-1.9.2.jar
- junit-platform-launcher-1.9.2.jar
- opentest4j-1.2.0.jar
常见的注解
-
@Test : 将一个方法标记为 单元测试方法,作为测试的入口, @Test修饰的方法是成员方法
-
@BeforeEach : 标记的方法 会在 每一个单元测试方法前 先执行
-
@AfterEach : 标记的方法 会在 每一个单元测试方法后 再执行
-
@BeforeAll : 标记的方法 会再 所有单元测试执行前 执行一次,且标记的方法必须是 static修饰的方法
-
@AfterAll : 标记的方法 会再 所有单元测试执行后 执行一次,且标记的方法必须是 static修饰的方法
-
@DisplayName : 更改单元测试 标记的名字
-
@Disabled : 将一个方法标记为 禁用测试
-
@Order(n) : 定义一个方法的测试顺序,但要配合 @TestMethodOrder注解才能工作
-
@RepeatedTest(10) : 重复测试多次
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Test {
@Test
@Order(1)
public void test(){
}
}