Java异常处理中的一些特殊情况举例

作者:goldensun 时间:2021-10-11 20:31:54 

只使用try和finally不使用catch的原因和场景
JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch。


class X
{
private final ReentrantLock lock = new ReentrantLock();
// ...

public void m()
{
lock.lock(); // block until condition holds
try
{
 // ... method body
} finally
{
 lock.unlock()
}
 }
}

为什么要使用这种结构?有什么好处呢?先看下面的代码


public void testTryAndFinally(String name)
{
 try
 {
  name.length();// NullPointerException
 }
 finally
 {
  System.out.println("aa");
 }
}

传递null该方法的执行结果是:在控制台打印aa,并抛出NullPointerException。执行流程是先执行try块,出现异常后执行finally块,最后向调用者抛出try中的异常。这种执行结果是很正常的,因为没有catch异常处理器,所有该方法只能将产生的异常向外抛;因为有finally,所以会在方法返回抛出异常之前,先执行finally代码块中的清理工作。

这种做法的好处是什么呢?对于testTryAndFinally来说,它做了自己必须要做的事(finally),并向外抛出自己无法处理的异常;对于调用者来说,能够感知出现的异常,并可以按照需要进行处理。也就是说这种结构实现了职责的分离,实现了异常处理(throw)与异常清理(finally)的解耦,让不同的方法专注于自己应该做的事。那什么时候使用try-finally,什么时候使用try-catch-finally呢?很显然这 取决于方法本身是否能够处理try中出现的异常 。如果自己可以处理,那么直接catch住,不用抛给方法的调用者;如果自己不知道怎么处理,就应该将异常向外抛,能够让调用者知道发生了异常。即在方法的签名中声明throws可能出现而自己又无法处理的异常,但是在方法内部做自己应该的事情。


finally语句不会被执行的情况
Java的finally语句不会被执行的唯一情况是:先执行了用于终止程序的System.exit()方法
 


public class Test  
{  
   public static void main(String[] args)  
  {  
      try
      {  
          System.out.println("Start");  
          System.exit(0);  

}finally
      {  
          System.out.println("Finally");  
      }  

System.out.println("End");  
   }  
}

输出结果为:


Start

 
当然,如果在执行一般的没有System.exit()语句的try语句时,突然断电了,这时所有进程都会终止,也不会执行finally语句。

标签:Java,异常处理
0
投稿

猜你喜欢

  • Druid基本配置及内置监控使用_动力节点Java学院整理

    2022-12-16 20:55:58
  • Unity延时执行的多种方法小结

    2022-03-16 10:49:32
  • Android中设置组件半透明和透明的效果示例

    2023-05-07 18:16:04
  • Java线程并发中常见的锁机制详细介绍

    2023-07-04 05:33:33
  • Java 常量与变量的区别详细介绍

    2023-03-09 13:30:48
  • Unity2D实现游戏回旋镖

    2022-07-16 07:13:50
  • java中申请不定长度数组ArrayList的方法

    2023-02-24 17:37:37
  • 详解Java的Struts框架中栈值和OGNL的使用

    2022-11-03 01:38:04
  • Android图片缓存之Bitmap详解(一)

    2021-10-24 15:45:08
  • 全网最详细Hutool工具详解

    2023-05-04 06:21:53
  • Java多态的全面系统解析

    2023-06-22 13:39:22
  • SpringMVC结构简介及常用注解汇总

    2023-10-25 09:16:59
  • c语言轻松实现猜数字小游戏

    2021-10-21 23:42:13
  • 浅谈VS中添加头文件时显示无法找到文件的问题

    2022-05-25 08:13:46
  • MyBatis通过JDBC数据驱动生成的执行语句问题

    2023-08-24 08:42:18
  • Android开发中ImageLoder加载网络图片时将图片设置为ImageView背景的方法

    2021-12-14 14:58:38
  • Spring BeanPostProcessor接口使用详解

    2022-12-18 09:19:36
  • SpringCloud之Config配置中心与Redis分布式锁详解

    2023-12-21 02:14:41
  • Java构造函数的相互调用代码示例

    2023-07-01 21:42:11
  • C# DataTable.Select()根据条件筛选数据问题

    2021-10-14 16:53:34
  • asp之家 软件编程 m.aspxhome.com