异常学习笔记


一、异常种类

受查异常

  • 编译时异常,必须处理完异常以后,才可以运行;
  • Java的标准包 java.lang java.util 和 java.net 中定义的异常都是非运行异常。

非受查异常

  • 运行时异常;
  • 程序中除数为0引起的错误、数组下标越界错误、错误的强制类型转换错误、使用了空对象NullPointerException等,它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。

常见的异常类

在这里插入图片描述

  • 算术异常类: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 区别

  • 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 的。

猜你喜欢

转载自blog.csdn.net/ccyzq/article/details/121788067