Java异常处理

异常处理

  • 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(){
    
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值