深入剖析Java中的各种异常处理方式

 更新时间:2015年07月31日 15:04:26   作者:zinss26914  
这篇文章主要介绍了深入剖析Java中的各种异常处理方式,是Java入门学习中的基础知识,需要的朋友可以参考下

1. 调试追踪代码:

  public static void enterTryMethod() { 
    System.out.println("enter after try field"); 
  } 
   
  public static void enterExceptionMethod() { 
    System.out.println("enter catch field"); 
  } 
   
  public static void enterFinallyMethod() { 
    System.out.println("enter finally method"); 
  } 

2. 抛出Exception,没有finally,当catch遇上return

   

public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 0; // 抛出Exception,后续处理被拒绝 
      enterTryMethod(); 
      return res; // Exception已经抛出,没有获得被执行的机会 
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1;  // Exception抛出,获得了调用方法并返回方法值的机会 
    } 
  } 

后台输出结果:

  enter catch field 
  1 

3. 抛出Exception,当catch体里有return,finally体的代码块将在catch执行return之前被执行

   

public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 0; // 抛出Exception,后续处理被拒绝 
      enterTryMethod(); 
      return res; // Exception已经抛出,没有获得被执行的机会 
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1;  // Exception抛出,获得了调用方法并返回方法值的机会 
    } finally { 
      enterFinallyMethod(); // Exception抛出,finally代码将在catch执行return之前被执行 
    } 
  } 

后台输出结果:

  enter catch field 
  enter finally method 
  1 

4. 不抛出Exception,当finally代码块里面遇上return,finally执行完后将结束整个方法

  public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 2; // 不抛出Exception 
      enterTryMethod(); 
      return res; // 获得被执行的机会,但执行需要在finally执行完成之后才能被执行 
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; 
    } finally { 
      enterFinallyMethod(); 
      return 1000; // finally中含有return语句,这个return将结束这个方法,不会在执行完之后再跳回try或者catch继续执行,方法到此结束 
    } 
  } 

后台输出结果:

  enter after try field 
  enter finally method 
  1000 

5. 不抛Exception,当finally代码块里面遇上System.exit()方法将结束和终止整个程序,而不只是方法

 

  public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 2; // 不抛出Exception 
      enterTryMethod(); 
      return res; // 获得被执行的机会,但由于finally已经终止程序,返回值没有机会被返回 
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; 
    } finally { 
      enterFinallyMethod(); 
      System.exit(0); // finally中含有System.exit()语句,System.exit()将退出整个程序,程序将被终止 
    } 
  } 

后台输出结果:

  enter after try field 
  enter finally method 

6. 抛出Exception,当catch和finally同时遇上return,catch的return返回值将不会被返回,finally的return语句将结束整个方法并返回

   

 public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 0; // 抛出Exception,后续处理将被拒绝 
      enterTryMethod(); 
      return res; // Exception已经抛出,没有获得被执行的机会 
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; // Exception已经抛出,获得被执行的机会,但返回操作将被finally截断 
    } finally { 
      enterFinallyMethod(); 
      return 10; // return将结束整个方法,返回值为10 
    } 
  } 

后台输出结果:

  enter catch field 
  enter finally method 
  10 

7. 不抛出Exception,当finally遇上return,try的return返回值将不会被返回,finally的return语句将结束整个方法并返回

   

 public static int catchTest() { 
    int res = 0; 
     
    try { 
      res = 10 / 2; // 不抛出Exception 
      enterTryMethod(); 
      return res; // 获得执行机会,但返回将被finally截断 
    } catch (Exception e) { 
      enterExceptionMethod(); 
      return 1; 
    } finally { 
      enterFinallyMethod(); 
      return 10; // return将结束整个方法,返回值为10 
    } 
  } 

后台输出结果:

  enter after try field 
  enter finally method 
  10 


结论
Java的异常处理中,程序执行完try里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有finally的代码块

    如果没有finally代码块,整个方法在执行完try代码块后返回相应的值来结束整个方法
    如果有finally代码块,此时程序执行到try代码块里的return一句之时并不会立即执行return,而是先去执行finally代码块里的代码

若finally代码块里没有return或没有能够终止程序的代码,程序在执行完finally代码块代码之后再返回try代码块执行return语句来结束整个方法。若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就OK了。

相关文章

  • 解决mybatis返回boolean值时数据库返回null的问题

    解决mybatis返回boolean值时数据库返回null的问题

    这篇文章主要介绍了解决mybatis返回boolean值时数据库返回null的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • java 打造阻塞式线程池的实例详解

    java 打造阻塞式线程池的实例详解

    这篇文章主要介绍了java 打造阻塞式线程池的实例详解的相关资料,这里提供实例帮助大家,理解这部分知识,需要的朋友可以参考下
    2017-07-07
  • Java把Map转为对象的实现代码

    Java把Map转为对象的实现代码

    在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,但这里,我想通过反射的方式对他们做转化,感兴趣的同学跟着小编来看看吧
    2023-08-08
  • Spring中的JdbcTemplate详细解析

    Spring中的JdbcTemplate详细解析

    这篇文章主要介绍了Spring中的JdbcTemplate详细解析,JdbcTemplate是Spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装,Spring框架为我们提供了很多的操作模板类,需要的朋友可以参考下
    2024-01-01
  • jar包冲突常用的解决方案

    jar包冲突常用的解决方案

    引言在使用java语言开发,maven做项目管理时,我们经常遇到一个头疼的问题就是jar包冲突,这篇文章主要给大家介绍了关于jar包冲突常用的解决方案,需要的朋友可以参考下
    2023-12-12
  • springboot整合netty框架的方式小结

    springboot整合netty框架的方式小结

    Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,这篇文章主要介绍了springboot整合netty框架的方式小结,需要的朋友可以参考下
    2022-06-06
  • JWT在OpenFeign调用中进行令牌中继详解

    JWT在OpenFeign调用中进行令牌中继详解

    Feign是一个声明式的Web Service客户端,是一种声明式、模板化的HTTP客户端。而OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等,这篇文章主要给大家介绍了关于JWT在OpenFeign调用中进行令牌中继的相关资料,需要的朋友可以参考下
    2021-10-10
  • Spring项目中使用Junit单元测试并配置数据源的操作

    Spring项目中使用Junit单元测试并配置数据源的操作

    这篇文章主要介绍了Spring项目中使用Junit单元测试并配置数据源的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 快速搭建springboot项目(新手入门)

    快速搭建springboot项目(新手入门)

    本文主要介绍了快速搭建springboot项目(新手入门),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 全面解析JTA 深度历险

    全面解析JTA 深度历险

    本文介绍了利用 JTA 深度历险的相关内容,充分举例说明JTA的原理和事务处理等相关内容,十分详细,需要的朋友可以参考下。
    2017-09-09

最新评论