一、异常基本概念的了解
1. 什么是异常
异常,见名知意思,就是错误,不正确的意思。在java语言中,异常是Java提供的一种识别及响应错误的一致性机制。将程序发生的不正常情况称为 异常。
2. 异常的分类
2.1. Throwable
Throwable 是 Java 语言中所有错误与异常的超类(基类)。
Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。
2.2 Error(错误)
定义:Error 类及其子类。程序中无法处理的错误,表示运行应用程序中出现了严重的错误。
2.3 Exception(异常)
定义:Exception 类及其子类。 程序本身可以捕获并且可以处理的异常。
2.3.1 运行时异常
RuntimeException 类及其子类,表示 JVM 在运行期间可能出现的异常。
2.3.2 编译时异常
Exception 中除 RuntimeException 及其子类之外的异常。
2.4 异常还可以如下分类
2.4.1 检查异常
编译器要求必须处理的异常。正确的程序在运行过程中,经常容易出现的、符合预期的异常情况。一旦发生此类异常,就必须采用某种方式进行处理。除 RuntimeException 及其子类外,其他的 Exception 异常都属于受检异常。编译器会检查此类异常,也就是说当编译器检查到应用中的某处可能会此类异常时,将会提示你处理本异常——要么使用try-catch捕获,要么使用方法签名中用 throws 关键字抛出,否则编译不通过。
2.4.2 非检查异常
编译器不会进行检查并且不要求必须处理的异常,也就说当程序中出现此类异常时,即使我们没有try-catch捕获它,也没有使用throws抛出该异常,编译也会正常通过。该类异常包括运行时异常(RuntimeException极其子类)和错误(Error)。
3. Java异常处理
3.1 异常处理关键字
- 抛出异常
- try
- catch
- finally
try{
// 可能产生异常的代码
}catch(Exception e){
// 异常处理方式1
}catch(Exception e){
// 异常处理方式2
}
- 处理异常
- throw
- throws
public void throwTest() throws Exception {
throw new Exception();
}
3.2 异常处理分类
二、常见面试题
异常的父类及继承关系
- Throwable
- Exception(异常)
- Error(错误)
error 与 exception 的区别
- error 系统级别的异常(错误)
- 通常指的是JVM虚拟机相关的错误(系统崩溃,内存不足,堆栈溢出),一旦发生就会终止。
- exception 可以捕获处理的异常,出现错误,对其进行处理,程序可以继续正常运行。
运行时异常:RuntimeException 及其子类
编译时异常:不是 RuntimeException 及其子类的异常(Checked Exception),比如IOException
处理异常的方式有哪些
- 抛出
- throw
- throws
- 处理
- try…catch…finally
throw 和 throws 的区别
区别:
常见的异常
- indexoutofboundsexception : 数组下标越界异常
- NullPointException : 空指针异常
- ClassCaseException : 数据类型转换异常
- IllegalArgumentException : 非法参数异常
- FileNotFoundException : 文件没有找到异常
- ArithmeticException - 计算异常
- SecurityException : 安全性异常
- NumberFormatException : 字符串转换为数字异常
- NoSuchMethodException : 方法不存在异常
- IOException : IO 异常
- sqlException : 数据库异常
final,fianlly,finalize 的区别
- final:final 是最终的意思,可以修饰变量,方法,类;用于声明变量,方法和类,分别表示被其修饰的变量不可变,被其修饰的方法不可重写,被其修饰的类不可继承。
- finally:异常处理机制中处理语句结构的一部分,try…catch 后面,表示必定会执行,我们常用的是关闭资源。
- finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”(可能不会马上执行,像是做了提醒动作),这是一个被动的方法(其实就是回调方法),不需要我们调用。
try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的代码会不会被执行,什么时候被执行,在 return 前还是后?
会执行,在方法返回前执行
我们一般不会在 finally 中改变返回值,因为如果存在 finally 代码块,try 中的 return 语句就不会立即返回给调用方,而是记录下来,或者理解为作为一个临时变量存储下来;待 finally 语句块执行完毕后再向调用方返回值,如果这个值被修改就会返回修改后的值。
- 持久更新中…