Java异常捕获之try-catch-finally-return的执行顺序-转载

情况1:try块中没有抛出异常try和finally块中都有return语句

[java] view plain copy

  1. public static int NoException(){
  2. int i=10;
  3. try{
  4. System.out.println("i in try block is"+i);
  5. return --i;
  6. }catch(Exception e){
  7. --i;
  8. System.out.println("i in catch - form try block is"+i);
  9. return --i;
  10. }finally{
  11. System.out.println("i in finally - from try or catch block is"+i);
  12. return --i;
  13. }
  14. }

执行结果:

i in try block is10
i in finally - from try or catch block is9
the method value is8

执行顺序:执行try块,执行到return语句时,先执行return的语句,--i,但是不返回到main 方法,执行finally块,遇到finally块中的return语句,执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值

情况2:try块中没有抛出异常,仅try中有return语句

代码:

[java] view plain copy

  1. public static int NoException(){
  2. int i=10;
  3. try{
  4. System.out.println("i in try block is--"+i);
  5. return --i;
  6. }catch(Exception e){
  7. --i;
  8. System.out.println("i in catch - form try block is--"+i);
  9. return --i;
  10. }finally{
  11. System.out.println("i in finally - from try or catch block is--"+i);
  12. --i;
  13. System.out.println("i in finally block is--"+i);
  14. //return --i;
  15. }
  16. }

执行结果:

i in try block is--10
i in finally - from try or catch block is--9
i in finally block is--8
the method value is--9

顺序:try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值

情况3:try块中抛出异常try,catch,finally中都有return语句

代码:

[java] view plain copy

  1. public static int WithException(){
  2. int i=10;
  3. try{
  4. System.out.println("i in try block is--"+i);
  5. i = i/0;
  6. return --i;
  7. }catch(Exception e){
  8. System.out.println("i in catch - form try block is--"+i);
  9. --i;
  10. System.out.println("i in catch block is--"+i);
  11. return --i;
  12. }finally{
  13. System.out.println("i in finally - from try or catch block is--"+i);
  14. --i;
  15. System.out.println("i in finally block is--"+i);
  16. return --i;
  17. }
  18. }

执行结果:

i in try block is--10
i in catch - form try block is--10
i in catch block is--9
i in finally - from try or catch block is--8
i in finally block is--7
the method value is--6

顺序,抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6

情况4,catch中有return,finally中没有,同上,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值

情况5:try和catch中都有异常,finally中无return语句

[java] view plain copy

  1. public static int CatchException(){
  2. int i=10;
  3. try{
  4. System.out.println("i in try block is--"+i);
  5. i=i/0;
  6. return --i;
  7. }catch(Exception e){
  8. System.out.println("i in catch - form try block is--"+i);
  9. int j = i/0;
  10. return --i;
  11. }finally{
  12. System.out.println("i in finally - from try or catch block is--"+i);
  13. --i;
  14. System.out.println("i in finally block is--"+i);
  15. //return --i;
  16. }
  17. }

结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
Exception in thread "main" java.lang.ArithmeticException: / by zero
 at exception.ExceptionTest0123.CatchException(ExceptionTest0123.java:29)
 at exception.ExceptionTest0123.main(ExceptionTest0123.java:17)

执行顺序:在try块中出现异常,到catch中,执行到异常,到finally中执行,finally执行结束后判断发现异常,抛出

情况6:try,catch中都出现异常,在finally中有返回

[javascript] view plain copy

  1. public static int CatchException(){
  2. int i=10;
  3. try{
  4. System.out.println("i in try block is--"+i);
  5. i=i/0;
  6. return --i;
  7. }catch(Exception e){
  8. System.out.println("i in catch - form try block is--"+i);
  9. int j = i/0;
  10. return --i;
  11. }finally{
  12. System.out.println("i in finally - from try or catch block is--"+i);
  13. --i;
  14. System.out.println("i in finally block is--"+i);
  15. return --i;
  16. }
  17. }

运行结果:

i in try block is--10
i in catch - form try block is--10
i in finally - from try or catch block is--10
i in finally block is--9
the method value is--8

执行顺序:try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常

没有catch,只有try和finally时,执行顺序和上面的几种情况差不多,只是少了catch块的执行

时间: 2024-08-10 02:39:17

Java异常捕获之try-catch-finally-return的执行顺序-转载的相关文章

Java异常捕获

1 public class Main { 2 3 /** 4 * 在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面, 5 * Exception这个异常的根类一定要刚在最后一个catch里面, 6 * 如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到异常的错误. 7 * @param args 8 */ 9 public static void main(String[] args) { 10 int a[] = new int[] {1,2,3,

Java finally语句与return语句执行顺序解析

网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

java中finally和return的执行顺序

注意:return的位置... 从这几个例子中可以看到,如果try之前没有有条件的return,则try..catch..finally语句块中的语句都是顺序执行(如果try中或者catch中 有return语句,那么先执行该return,然后执行finally, 如果finally中也有return, 该出的返回值会覆盖掉try 和 catch中的return值: 如果try..catch..finally语句块之后有return语句, try中.catch中.finally中都没有 (有条件

浅谈Java语言中try{}catch{}和finally{}的执行顺序问题

浅谈Java语言中try{}catch{}和finally{}的执行顺序问题 2019-04-06  PM  13:41:46  1. 不管有没有出现异常,finally块中代码都会执行: 2. 当try和catch中有return时,finally仍然会执行: 3. finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的:

finally,return 的执行顺序

参考:http://blog.csdn.net/qj19842011/article/details/45675057 关于finally,return的执行顺序 例子:  try{     return expression; }finally{    do some work; } 1.执行:expression,计算该表达式,结果保存在操作数栈顶: 2.执行:操作数栈顶值(expression的结果)复制到局部变量区作为返回值: 3.执行:finally语句块中的代码: 4.执行:将第2步

java中成员变量、代码块、构造函数执行顺序

1.java虚拟机运行程序,首先需要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类.初始化子类静态代码块和成员变量 2.load完毕父类与子类后,从main函数入口执行程序,先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时,先初始化非静态成员变量和非静态代码块,接着执行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着执行子类构造方法. package it.xiangnan.test; public

java新建对象的static块与构造器的执行顺序

前言:本文解决的问题 新建一个对象静态代码块什么时候执行 {}里面的代码什么时候执行 有继承关系时的执行顺序 1.问题出现的背景: 构造器是用来实例化一个对象,当我们使用new关键字来新建对象时,构造器就会被调用.如果class中含有静态代码块(static)和普通代码块(在{}括号下),新建对象时的调用顺序是:静态代码块>{里面的代码}>构造器. 2.例子说明: 2.1代码说明 //父类 public class StaticExample{ { System.out.println(&qu

java异常捕获的一点感悟

class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch ( Annoyance a ) { System.out.println("Caught Annoyance"); thro

java 异常捕获小记

java 中异常捕获常用的为: try{ //业务代码 }catch(Exception e){ //异常捕获 }finally{ // 不管有无异常, 最后都会执行到这里 } 在方法体内如果想要把异常抛出到方法外, 在定义方法的时候 需要通过 throws 来声明所要抛出的异常类型, 在调用该方法的方法内,可以捕获该异常 如: public void function(String args) throws Exception{ if(null == args){ throw new Null