NO.6 异常: 初识 | Java敲黑板系列

开场白

老铁:在Java世界里,异常的出现让我们编写的程序运行起来更加的健壮,同时为程序在调试、运行期间发生的一些意外情况,提供了补救机会;即使遇到一些严重错误而无法弥补,异常也会非常忠实的记录所发生的这一切。

今天来到我们第6期“Java敲黑板系列”的正是异常兄弟,有请!

由于异常背后有太多故事值得我们开发人员所关注,为此,这次专访将分几期为老铁们进行呈现,全面展现异常在各种业务场景下的应用方法与注意事项。

异常

结合下图理解下面的内容,效果更佳。

图1

异常对象都是派生于Throwable类的一个实例。Error和Exception类是Throwable类的直接子类。

Error类主要用于描述Java运行时系统的内部错误和资源耗尽错误。我们编写的业务代码一般不会抛出这种类型,一般由Java内部代码所抛出。这种异常一旦发生,一方面可通知给用户;另一方面尽力使程序安全地终止;剩下的别无它法,全凭天意。但是,在现实场景中这种异常很少出现。

Exception类是我们的“老熟人”了。RuntimeException和IOException等都是Exception的子类。其中由程序错误导致的异常属于RuntimeException,为此,一旦出现了RuntimeException,那么问题一定是出在你身上;而程序本身没毛病,但是由于像I/O错误这类问题导致的异常都统称为其他异常,这里比较著名的就是IOException了。

异常是用来被捕捉的

try{
    //业务代码
    ...       //1
}catch (ExceptionType ex){
    //异常发生后的处理代码
    ...       //2
}finally{
    //不管是否有异常被捕捉,finally代码都将被执行
    //这里的代码常用于回收资源
    ...       //3
}

敲黑板:

如代码片段1所示,是经典的“异常处理三段式”:

  1. try子句主要用于实现业务代码,如//1所示。
  2. catch子句是当try子句在执行的过程中发生ExceptionType类型的异常才会被触发执行,如//2所示。
  3. finally子句是无论异常是否被触发、捕捉,都会被执行。该子句的代码主要用于回收资源,如//3所示。

需要说明的是:上述经典三段论是完整的异常处理形式,一般在实际运用过程中可以有三种基本形式:try/catch;try/finally;try/catch/finally。

根据上述三段式描述,我们可以进一步进行推论,得出异常控制流的执行规则:

  1. 一旦某个异常发生,异常控制流会立刻转移到下面三者之一:catch子句、finally子句、该函数的调用端。
  2. 如果同时存在catch子句与finally子句,则控制流会先转移到catch子句,然后跳转执行finally子句。
  3. 如果没有catch子句,控制流便转移到finally子句。

小结

敲黑板,画重点:

  1. 异常是用来被捕捉的,异常捕捉与处理采用经典的三段式。
  2. 异常控制流的处理规则是:如果同时存在catch子句与finally子句,则控制流会先转移到catch子句,然后跳转执行finally子句;如果没有catch子句,控制流便转移到finally子句。
  3. 由于Java支持垃圾回收机制,为此,如果函数正常结束或异常而被迫退出,该函数所创建的所有对象会被自动回收,但是对于Socket或File资源必须要执行清理操作,以便资源回收。

转载自公众号:代码荣耀
图2

猜你喜欢

转载自blog.csdn.net/maijia0754/article/details/80568305