JavaSE|异常学习笔记


文章目录

  • 一、异常种类
    • 受查异常
    • 非受查异常
    • 常见的异常类
  • 二、防御式编程
  • 三、异常基本用法
  • 四、异常处理流程
  • throw 和 throws 区别
  • final、finally、finalize 区别
  • try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

一、异常种类 受查异常
  • 编译时异常,必须处理完异常以后,才可以运行;
  • Java的标准包 java.lang java.util 和 java.net 中定义的异常都是非运行异常。
非受查异常
  • 运行时异常;
  • 程序中除数为0引起的错误、数组下标越界错误、错误的强制类型转换错误、使用了空对象NullPointerException等,它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。
常见的异常类 JavaSE|异常学习笔记
文章图片

  • 算术异常类:ArithmeticExecption
  • 空指针异常类:NullPointerException
  • 类型强制转换异常:ClassCastException
  • 数组负下标异常:NegativeArrayException
  • 数组下标越界异常:ArrayIndexOutOfBoundsException
  • 文件未找到异常:FileNotFoundException
  • 字符串转换为数字异常:NumberFormatException
  • 操作数据库异常:SQLException
  • 输入输出异常:IOException
  • 方法未找到异常:NoSuchMethodException
二、防御式编程
  • LBYL: look brfore your leap. 在操作之前就做好充分的准备;
  • EAFP: it’s easier to ask forgiveness than permission. 先操作,遇到问题在处理
三、异常基本用法
try { 有可能出现异常的语句; } catch(异常类型 异常对象) { 出现异常后的行为; } finally { 异常的出口 }

  • 一段代码中可能会抛出不同种的异常,不同异常会有不同的处理方式,所以可以搭配多个 catch 代码块,但是只有一个可以被执行; 也可以使用 catch (NullPointerException | ArithmeticExecption e) {} ;
  • finally 可以不使用直接使用 try 回收资源;
  • 如果方法中没有合适的异常处理方式,就会沿着调用栈向上传递;
四、异常处理流程 先执行 try 中的代码; 如果 try 中的代码出现异常,就会结束 try 中的代码,在 catch 代码块中找到相对应的异常类型,如果找到就会执行 catch 中的代码; 如果没有找到,就会向上传递到上层调用者; 一直到 main 方法也没有合适的代码处理异常,就会交给 JVM 来处理,这时程序就会异常终止。无论是否找到匹配的异常类型, finally 代码块都会在该方法结束前执行。
throw 和 throws 区别 throw是语句抛出一个异常; throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
final、finally、finalize 区别
  • 【JavaSE|异常学习笔记】final 用于修饰变量、方法和类。
    • final 变量:被修饰的变量不可变,不可变分为引用不可变和对象不可变,final 指的是引用不可变,final 修饰的变量必须初始化,通常称被修饰的变量为常量。
    • final 方法:被修饰的方法不允许任何子类重写,子类可以使用该方法。
    • final 类:被修饰的类不能被继承,所有方法不能被重写。
  • finally 作为异常处理的一部分,它只能在 try/catch 语句中,并且附带一个语句块表示这段语句最终一定被执行(无论是否抛出异常),经常被用在需要释放资源的情况下,System.exit (0) 可以阻断 finally 执行。
  • finalize 是在 java.lang.Object 里定义的方法,也就是说每一个对象都有这么个方法,这个方法在 gc 启动,该对象被回收的时候被调用。
    一个对象的 finalize 方法只会被调用一次,finalize 被调用不一定会立即回收该对象,所以有可能调用 finalize 后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会再次调用 finalize 了,进而产生问题,因此不推荐使用 finalize 方法。
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
  • 任何执行 try 或者 catch 中的 return 语句之前,都会先执行 finally 语句,如果 finally 存在的话。如果 finally 中有 return 语句,那么程序就 return 了,所以 finally 中的 return 是一定会被 return 的。

    推荐阅读