摘要:在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的换成去理解就了
原文地址:java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
前言:
java 中的异常处理机制你真的理解了吗?掌握了吗?
catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit() 方法怎么处理?当 catch 和 finally 体里同时遇上 return 怎么办?
相信你在处理异常的时候不是每次都把它 throws 掉就完事了,很多时候异常是需要我们自己来 catch 并针对所抛出的 Exception 做一些后续的处理工作。
直接上代码,先贴下面测试需要调用的方法:
1 2 // catch 后续处理工作 3 public static boolean catchMethod() { 4 System.out.print("call catchMethod and return --->> "); 5 return false; 6 } 7 // finally后续处理工作 8 public static void finallyMethod() { 9 System.out.println(); 10 System.out.print("call finallyMethod and do something --->> "); 11 } 12
抛出 Exception,没有 finally,当 catch 遇上 return
1 2public static boolean catchTest() { 3 try { 4 int i = 10 / 0; // 抛出 Exception,后续处理被拒绝 5 System.out.println("i vaule is : " + i); 6 return true; // Exception 已经抛出,没有获得被执行的机会 7 } catch (Exception e) { 8 System.out.println(" -- Exception --"); 9 return catchMethod(); // Exception 抛出,获得了调用方法并返回方法值的机会 10 } 11 } 12
后台输出结果:
1 2 -- Exception -- 3call catchMethod and return --->> false 4
抛出 Exception,当 catch 体里有 return,finally 体的代码块将在 catch 执行 return 之前被执行
1 2public static boolean catchFinallyTest1() { 3 try { 4 int i = 10 / 0; // 抛出 Exception,后续处理被拒绝 5 System.out.println("i vaule is : " + i); 6 return true; // Exception 已经抛出,没有获得被执行的机会 7 } catch (Exception e) { 8 System.out.println(" -- Exception --"); 9 return catchMethod(); // Exception 抛出,获得了调用方法的机会,但方法值在 finally 执行完后才返回 10 }finally{ 11 finallyMethod(); // Exception 抛出,finally 代码块将在 catch 执行 return 之前被执行 12 } 13 } 14
后台输出结果:
1 2 -- Exception -- 3call catchMethod and return --->> 4call finallyMethod and do something --->> false 5
不抛 Exception,当 finally 代码块里面遇上 return,finally 执行完后将结束整个方法
1 2public static boolean catchFinallyTest2() { 3 try { 4 int i = 10 / 2; // 不抛出 Exception 5 System.out.println("i vaule is : " + i); 6 return true; // 获得被执行的机会,但执行需要在 finally 执行完成之后才能被执行 7 } catch (Exception e) { 8 System.out.println(" -- Exception --"); 9 return catchMethod(); 10 }finally{ 11 finallyMethod(); 12 return false; // finally 中含有 return 语句,这个 return 将结束这个方法,不会在执行完之后再跳回 try 或 catch 继续执行,方法到此结束,返回 false 13 } 14 } 15
后台输出结果:
1 2i vaule is : 5 3 4call finallyMethod and do something --->> false 5
不抛 Exception,当 finally 代码块里面遇上 System.exit() 方法 将结束和终止整个程序,而不只是方法
1 2public static boolean finallyExitTest() { 3 try { 4 int i = 10 / 2; // 不抛出 Exception 5 System.out.println("i vaule is : " + i); 6 return true; // 获得被执行的机会,但由于 finally 已经终止程序,返回值没有机会被返回 7 } catch (Exception e) { 8 System.out.println(" -- Exception --"); 9 return true;
10 }finally {
11 finallyMethod();
12 System.exit(0);// finally 中含有 System.exit() 语句,System.exit() 将退出整个程序,程序将被终止
13 }
14 }
15
后台输出结果:
1 2i vaule is : 5 3 4call finallyMethod and do something --->> 5
抛出 Exception,当 catch 和 finally 同时遇上 return,catch 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
1
2public static boolean finallyTest1() {
3 try {
4 int i = 10 / 0; // 抛出 Exception,后续处理被拒绝
5 System.out.println("i vaule is : " + i);
6 return true; // Exception 已经抛出,没有获得被执行的机会
7 } catch (Exception e) {
8 System.out.println(" -- Exception --");
9 return true; // Exception 已经抛出,获得被执行的机会,但返回操作将被 finally 截断 10 }finally { 11 finallyMethod(); 12 return false; // return 将结束整个方法,返回 false 13 } 14 } 15
后台输出结果:
1 2 -- Exception -- 3 4call finallyMethod and do something --->> false 5
不抛出 Exception,当 finally 遇上 return,try 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
1 2public static boolean finallyTest2() { 3 try { 4 int i = 10 / 2; // 不抛出 Exception 5 System.out.println("i vaule is : " + i); 6 return true; // 获得被执行的机会,但返回将被 finally 截断 7 } catch (Exception e) { 8 System.out.println(" -- Exception --"); 9 return true;
10 }finally {
11 finallyMethod();
12 return false; // return 将结束这个方法,不会在执行完之后再跳回 try 或 catch 继续执行,返回 false
13 }
14 }
15
后台输出结果:
1 2i vaule is : 5 3 4call finallyMethod and do something --->> false 5
结语:
(假设方法需要返回值)
java 的异常处理中,
在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块,
如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;
如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,
若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;
若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就 OK 了 _
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65909.html
摘要:不相等的对象要具有不相等的哈希码为了哈希表的操作效率,这一点很重要,但不是强制要求,最低要求是不相等的对象不能共用一个哈希码。方法和方法协同工作,返回对象的哈希码。这个哈希码基于对象的身份生成,而不是对象的相等性。 本文面向 刚学完Java的新手们。这篇文章不讲语法,而是一些除了语法必须了解的概念。 将要去面试的初级工程师们。查漏补缺,以免遭遇不测。 目前由于篇幅而被挪出本文的知识...
捕获和处理异常 本节描述如何使用三个异常处理程序组件 — try、catch和finally块 — 来编写异常处理程序,然后,解释了Java SE 7中引入的try-with-resources语句,try-with-resources语句特别适用于使用Closeable资源的情况,例如流。 本节的最后一部分将介绍一个示例,并分析各种场景中发生的情况。 以下示例定义并实现名为ListOfNumbe...
摘要:程序执行时,至少会有一个线程在运行,这个运行的线程被称为主线程。程序的终止是指除守护线程以外的线程全部终止。多线程程序由多个线程组成的程序称为多线程程序。线程休眠期间可以被中断,中断将会抛出异常。 线程 我们在阅读程序时,表面看来是在跟踪程序的处理流程,实际上跟踪的是线程的执行。 单线程程序 在单线程程序中,在某个时间点执行的处理只有一个。 Java 程序执行时,至少会有一个线程在运行...
摘要:拆箱将包装类型转换为基本类型的过程。否则会抛出异常。默认采用单链表解决冲突,如果链表长度超过,将单链表转换为红黑树。内部使用红黑树实现,存储映射。红黑树减弱了对平衡的要求,降低了保持树平衡需要的开销,在实际应用中,统计性能超过平衡二叉树。 引言 showImg(https://segmentfault.com/img/bVbv7Mr?w=242&h=410); 在学习《Java编程的逻...
阅读 532·2021-11-25 09:44
阅读 2614·2021-11-24 09:39
阅读 2268·2021-11-22 15:29
阅读 3501·2021-11-15 11:37
阅读 3352·2021-09-24 10:36
阅读 2470·2021-09-04 16:41
阅读 940·2021-09-03 10:28
阅读 1775·2019-08-30 15:55