Java异常
当程序运行的途中,发生了在期待中不应该发生的事件,这个时间阻止了程序按照程序员的预期正常执行,这类问题一般是程序员在编写程序时,忽略程序运行中可能导致的错误,是可以通过修改程序逻辑达到正确的结果的问题,被称为异常(Exception)。同时还有非程序逻辑错误,程序员也无法解决的问题,这类问题被称为错误(Error)。
在异常发生的时候,是让程序继续运行还是立刻终止退出程序,还是将错误反馈给程序用户?在Java中提供了更加优秀的解决方案:异常的处理机制。
异常处理
在Java中,异常处理机制会在程序发生异常的时候,按照代码预先设定的异常处理逻辑,有目的,针对性的处理这些异常,让程序尽最大的可能恢复正常并继续执行。
Java中的异常可以是函数中的语句执行的时候发生的,也可以是程序员向上手动抛出(throw),只要在Java程序中产生了异常,就会用一个对应类型的异常对象来封装异常,JRE就会试图寻找异常处理程序来处理异常。
Java中异常分类和类结构图
Java标准库中已经存在了一些通用的异常类,所以的异常类的顶级父类都是Throwable。
Throwable又派生出Error类和Exception类,在前面说到了Error类是程序员无法解决的问题,所以只要关注Exception类下的常用异常类即可。
根据上图,异常类又可以分为俩种:
非检查异常(unckecked exception):
程序员在IDE中编写程序和javac在编译的时候,不会提示和发现这些异常,只有在程序运行时才会发现的一些异常,叫做非检查异常。对于这些异常,程序员应该修改代码,让程序如愿正常运行,而不是通过异常处理机制处理,因为这样的异常一般时程序逻辑有问题。
常见的此类异常有:
NullPointerException(空指针异常);
ArrayIndexOutOfBoundsException(数组下标越界);
ClassCastException(强制类型转换错误);
检查异常(checked exception):
程序员在编写代码时,javac或IDE会强制要求程序员为这些异常做预备处理工作,要么使用try…catch…finally语句将可能发生的异常处理并抛出,或者将这些异常通过向上抛出处理,否者编译无法通过,这样的异常一般是由程序的运行环境导致的,因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。
常见的此类异常有:
SQLException (SQL语句异常);
IOException(IO异常);
ClassNotFoundException(无法找到类异常);
异常处理语法
在编写代码处理异常时,对于检查异常,有2种不同的处理方式:使用try…catch…finally语句块处理它。或者,在函数签名中使用throws 声明交给函数调用者caller去解决。
try…catch…finally 语法
try {
//在try中放入可能会发生异常的代码片段
//如果出现异常则会在catch中匹配相应的异常处理方法
//finanlly不管是否出现异常都会执行其中的代码
} catch (Exception e) {
//每一个catch块用于捕获并处理一个特定的异常,或者这异常类型的子类。
//catch后面的括号定义了异常类型和异常参数。如果异常与之匹配且是最先匹配到的,则虚拟机将使用这个catch块来处理异常。
//如果try中没有发生异常,则所有的catch块将被忽略。
}finally {
//finally块不是必须的,是可选的。
//无论异常是否发生,异常是否被匹配处理,finally中的内容都会被执行
//一个try至少要有一个catch块,否则, 至少要有1个finally块。但是finally不是用来处理异常的,finally不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
}
—————————分割线————————————————————————————————
以上内容都是目前所理解的,非最终版本,会根据工作和学习的深入慢慢加深理解,更新在上面(2020.5.19版)。