图解
详解
- 注意:编译时异常和运行时异常都是发生在运行阶段,编译阶段异常是不会发生的。
- 编译时异常因什么而得名,因为编译时异常必须在编译(编写)程序阶段预先处理,否则编译器会报错。
- 所有异常都是在程序运行阶段发生的,因为只有程序运行阶段从才可以new对象。异常的发生就是new异常对象。
- 两者异同:编译时异常发生的概率较高
异常处理
异常处理机制的作用:增强程序得健壮性。做到就算异常发生了也不影响程序的执行。
Java语言中对异常处理只有两种方式
- 第一种方式:在方法声明得位置,使用throw关键字,抛给上一级(调用者)。
- 第二种方式:使用try…catch语句进行异常的捕获。
- 注意:Java中的异常发生之后如果一直往上抛,最终抛给了main方法,main方法继续抛给了JVM,JVM知道这个异常发生,只有一个结果,那就是终止Java程序的执行。
- 上抛类似于推卸责任;而捕捉等于把异常拦截下来,异常真正的解决了。
- 一般main方法不进行throw上抛,而是使用try…catch捕获。
- try语句块中出现异常,try语句块中语句不再执行,try之外的语句还会执行,直接跳到catch进行异常处理。
- catch后面得小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型。
- catch可以写多个(从小到大写)。建议catch的时候,精确的一个一个处理,这样有利于程序的调试。
- JDK8新特性catch(FileNotFoundException | ArithmeticException | NullPointerException e) 可以用符号“|”来分多个异常。
- finally与try搭配使用,finally中的代码一定会执行(通常完成资源的释放),即使try中出现异常。
- finally唯一不执行方法:System.exit(0); // 退出JVM
- 经典面试题
- 异常方式选择:如果希望调用者来处理就用上抛,其余都用捕获处理。
异常对象的常用方法
- 获取异常简单的描述信息
- getMessage()
- 打印异常追踪的堆栈信息(Java后台采用了异步线程的方式)
- printStackTrace()
- printStackTrace()
如何查看异常信息
- 异常信息是按照栈打印的,所以错误根源在最上边,可以快速调试程序。
fianl finally finalize 的区别
- final 是一个关键字,表示最终的。
- finally 也是一个关键字,常与try联合使用,使用在异常处理机制中。
- finalize() 是Object中的一个方法,作为方法名出现,这个方法是由垃圾回收器GC负责调用的。
throws throw 的区别
- throws:在方法声明位置上使用,表示上报异常信息给调用者。
- throw:手动抛出异常!
如何自定义异常
- 第一步:编写一个类继承Exception(编译时异常)或者RuntimeException(运行时异常)。
- 第二步:提供两个构造方法,一个无参的,一个带有String参数的。
// 编译时异常
public class MyException extends Exception {
public MyException() {
}
public MyException(String s) {
super(s);
}
}
- 注意:重写之后的方法不能比重写之前的方法抛出更多(更宽泛)的异常,可以更少。