欢迎光临
我们一起进阶

Java异常处理(三):捕获异常

扫码或搜索:沉默王二
发送 290992
即可立即永久解锁本站全部文章

捕获异常可以使用 try catch 或者 try catch finally,它们之间有什么区别呢?

try-catch

try {
    ......
     //可能产生的异常的代码区,也称为监控区
    ......
    }catch (ExceptionType1 e) {
     //捕获并处理try抛出异常类型为ExceptionType1的异常
    }catch(ExceptionType2 e) {
     //捕获并处理try抛出异常类型为ExceptionType2的异常
    }

监控区一旦发生异常,虚拟机根据当前运行时的信息创建异常对象,并将该异常对象抛出监控区,同时虚拟机根据该异常对象依次匹配 catch 子句。若匹配成功(抛出的异常对象的类型和 catch 子句的异常类的类型或者是该异常类的子类的类型一致),则运行其中 catch 代码块中的异常处理代码。一旦处理结束那就意味着整个 try-catch 结束。对于含有多个 catch 子句的情况,一旦其中一个 catch 子句与抛出的异常对象类型一致时,其他 catch 子句将不再有匹配异常对象的机会。

try-catch-finally

try {
    .......
     //可能产生的异常的代码区
 .......
 }catch (ExceptionType1 e) {
     //捕获并处理try抛出异常类型为ExceptionType1的异常
 }catch (ExceptionType2 e){
     //捕获并处理try抛出异常类型为ExceptionType2的异常
 }finally{
     //无论是出现异常,finally块中的代码都将被执行
 }

try-catch-finally 代码块的执行顺序按照以下方式进行:

try 没有捕获异常时,try 代码块中的语句依次被执行,跳过 catch。如果存在 finally 则执行 finally 代码块,否则执行后续代码。

try 捕获到异常时,如果没有与之匹配的 catch 子句,则该异常交给 JVM 处理。如果存在 finally,则其中的代码仍然被执行,但是 finally 之后的代码不会被执行。

try 捕获到异常时,如果存在与之匹配的 catch,则跳到该 catch 代码块执行处理。如果存在 finally 则执行 finally 代码块。执行完 finally 代码块之后继续执行后续代码;否则直接执行后续代码。需要注意,try 代码块出现异常之后的代码不会被执行,如下图所示:

小结:

try 代码块:用于捕获异常。其后可以接零个或者多个 catch 块。如果没有 catch 块,后必须跟 finally 块来完成资源释放等操作。另外建议不要在 finally 中使用 return。不用尝试通过 catch 来控制代码流程。

catch 代码块:用于捕获异常,并在其中处理异常。

finally 代码块:无论是否捕获异常,finally 代码总会被执行。如果 try 代码块或者 catch 代码块中有 return 语句时,finally 代码块将在方法返回前被执行。注意以下几种情况,finally 代码块不会被执行。

  • 在前边的代码中使用
  • 程序所在的线程死亡或者(系统突然关机)
  • 如果在 finally 代码块中的操作又产生异常,则该 finally 代码块不能完全执行结束,同时该异常会覆盖之前抛出的异常
赞(0) 打赏
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

小白学堂,学的不止是技术,更是前程

关于我们免责声明

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏