当前位置: 首页 > 编程笔记 >

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

夏祺然
2023-03-14
本文向大家介绍深入剖析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了。

 类似资料:
  • 本文向大家介绍Java异常处理中的各种细节汇总,包括了Java异常处理中的各种细节汇总的使用技巧和注意事项,需要的朋友参考一下 前言 今天我们来讨论一下,程序中的错误处理。 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeException,我们就需要使用 try-catch-finally 语句

  • 本文向大家介绍深入剖析$.ajax()方法,包括了深入剖析$.ajax()方法的使用技巧和注意事项,需要的朋友参考一下 url: 要求为string类型的参数,(默认为当前页地址)发送请求的地址。 type: 要求为string类型的参数,请求方式(post活get)默认为get。注意其他http请求方法,例如put和delete也可以使用,但仅部分浏览器支持。 timeout: 要求为Numbe

  • 本文向大家介绍深入理解Java之HashMap源码剖析,包括了深入理解Java之HashMap源码剖析的使用技巧和注意事项,需要的朋友参考一下 一、HashMap概述 HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺

  • 本文向大家介绍深入剖析java中的集合框架,包括了深入剖析java中的集合框架的使用技巧和注意事项,需要的朋友参考一下 解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架。 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护。 集合完全弥补了数组的缺陷。 02.集合框架的内容  集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的

  • 本文向大家介绍Spring MVC中异常处理的三种方式,包括了Spring MVC中异常处理的三种方式的使用技巧和注意事项,需要的朋友参考一下 前言 在 SpringMVC, SpringBoot 处理 web 请求时, 若遇到错误或者异常,返回给用户一个良好的错误信息比 Whitelabel Error Page 好的多。 SpringMVC 提供了三种异常处理方式, 良好的运用它们可以给用户提

  • 本文向大家介绍深入理解Python异常处理的哲学,包括了深入理解Python异常处理的哲学的使用技巧和注意事项,需要的朋友参考一下 所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事。异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学。限于认知能力和经验所限,不可能达到像解释器下import this看到的python设计之禅一样