异常
异常的英文单词是exception,也就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用、数组下标越界、内存溢出错误,在如2/0,或者其他的因素干扰,这些都是意外的情况,从而导致程序出错的现象,叫做异常
在Java中异常的父类是java.lang.Throwable类,异常类分为两大类:Error和Exception。
Error是无法处理的异常,一般发生这种异常,JVM会选择终止程序。因此我们编写程序时不需要关心这类异常。
Exception,也就是我们经常见到的一些异常情况,比如NullPointerException、IndexOutOfBoundsException,ClassCastException,这些异常是我们可以处理的异常。
一旦代码出现了异常,程序就会被终止掉
java中处理异常的方法
处理异常的目的 :让程序继续运行,同时提醒用户
1、使用try catch 语句块尝试着抓取异常
try{
//可能出现异常的代码
}
catch (XxxException e) {
// 当代码触发了异常,
// 代码会进入到catch中需要执行的代码
}
异常对象中的两个方法
// 打印异常触发的栈信息
e.printStackTrace();
// 获取异常信息
e.getMessage()
try catch的运行流程
三个块执行的顺序为try—>catch—>finally。
try {
} catch (ArithmeticException e) {
} finally {
// 一定要执行的代码块
// 不管是否存在异常,finally中的必须执行
// 资源释放等工作凡在finally
}
try关键字用来包围可能会出现异常的逻辑代码,它单独无法使用,必须配合catch或者finally使用。Java编译器允许的组合使用形式只有以下三种形式:
try...catch...; try....finally......; try....catch...finally...
当然catch块可以有多个,注意try块只能有一个,finally块是可选的(但是最多只能有一个finally块)。
当然如果没有发生异常,则catch块不会执行。但是finally块无论在什么情况下都是会执行的(这点要非常注意,因此部分情况下,都会将释放资源的操作放在finally块中进行)。
在有多个catch块的时候,是按照catch块的先后顺序进行匹配的,一旦异常类型被一个catch块匹配,则不会与后面的catch块进行匹配。
在使用try…catch…finally块的时候,注意千万不要在finally块中使用return,因为finally中的return会覆盖已有的返回值。
注意:当捕获到一个异常后,其他异常就没法办法捕获了就会直接跳到catch之后的语句都不会执行
异常抛出(throws关键字的使用)
2、不处理 用throws进行抛抛给调用者
在方法的名称后面使用throws 抛出异常,将可能出现的异常抛给调用者
有调用者来处理异常,如果调用者也不处理异常,则继续向上抛,最后如果都不处理,则会有main函数抛给JVM
throws和thow关键字
throws出现在方法的声明中,表示该方法可能会抛出的异常,然后交给上层调用它的方法程序处理,允许throws后面跟着多个异常类型;一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。throw只会出现在方法体中,当方法在执行过程中遇到异常情况时,将异常信息封装为异常对象,然后throw出去。throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由方法去处理异常,真正的处理异常由此方法的上层调用处理。
异常处理介意:
1.只在必要使用异常的地方才使用异常,不要用异常去控制程序的流程
2.不能使用空catch块
3. 异常处理尽量放在高层进行
4. 在finally中释放资源