JAVA异常处理机制的个人理解(try catch throw finally)

原创 2013年03月20日 17:17:40

搜到了这篇文章 ,下面说下我自己的问题与理解。


我看完程序给出的输出是:

i=2

i=1

testEx2, catch exception
testEx2, finally; return value=false
testEx1, at the end of try
testEx, finally; return value=false


但(= =)答案是:

i=2

i=1

testEx2, catch exception
testEx2, finally; return value=false
testEx1, finally; return value=false
testEx, finally; return value=false


回头重读程序,发现问题在于方法testEx1那里。

对该程序的分析如下:首先主函数调用方法testEx(),其内部的ret不断指向下一个异常方法,运行到testEx2()时,try内的内容出现异常(除数i=0,此时已输出i=2和i=1),接着进入catch 输出"testEx2, catch exception",ret被置为false。接着是一个throw语句(这个一会儿再说)。进入finally后输出"testEx2, finally; return value=false"(不论异常是否发生finally都会被执行)。此时方法testEx2()结束,为testEx1()中的ret返回false,程序回到testEx1()

接着问题就来了。if条件成立后,运行里面的return放弃try里后面的语句,但运行return之后testEx1()并不是直接返回到testEx()里的ret,而是接着运行它的finally!随即输出一行testEx1, finally; return value=false,返回一个false。

此时这里又出现一个问题:testEx1()返回给ret的值到底是if里的还是finally里的呢?

所以我将testEx1()中finally内最前面加了一句“ret=true;”。运行程序,输出结果如下:

        

可见,testEx1()给testEx()返回的是finally内的return而不是try内的。那么try内的return是被后面的覆盖掉了还是根本没有执行呢?我将finally内的return注释掉,发现得到的结果与上面的完全相同!(方法一开始ret有被初始化为true)然后我在 testEx1()内加了一行输出,实验证明if内的代码确实有被执行。往下继续看文章发现“那么写在try或者catch中的return语句也就不会真正的从该函数中跳出了,它的作用在这种情况下就变成了将控制权(语句流程)转到finally块中”。这也就是说try内的return是根本不会把值真正返回去的,而是看到return就直接跳转到finally。这样问题就得到了很好解释。

纵观java的异常处理机制大概是这个意思:try里面包含的是有可能会出现异常的代码,异常真的发生以后转到相应异常类型的catch中 对异常进行处理。catch中对异常的处理又有方法上的区别。第一种比较负责任的方法是,在catch中直接处理异常(输出异常信息 返回一个值);第二种就要用到throw,比如:

boolean testEx() throws Exception{

try {

int i=0;

int a=12/i;

}

catch(Exception e){

System.out.println("可有可无的异常信息提示");

throw e;

rerurn false;

}

finally{

//code

}

}

这里的throw是向上抛出一个异常,意思就是把这个异常实例返回给该方法的调用者,让调用者处理。此时最好在方法名后面加上提示性的“throws Exception”,意在提示该方法的调用者:这个方法里可能会抛出一个Exception类型的异常,你要记得在上层处理它。

当throw被执行时,它所在的try/catch内的后面的代码并不被继续执行,但finally作为异常处理机制的出口 还是依然故我。总结一下就是不论出现什么情况finally都会被运行,finally威武!

这里只是浅显的总结一下java异常处理机制,其它的请看那篇很全面的神文章。

本文有点条理不清,敬请原谅,毕竟我初学java,第一次写技术博客。如有错误欢迎指出~

关于try-catch、throw、finally在异常时的执行顺序

package test; //jdk 1.8 public class TestException1 { /** * catch中的return和throw是不能共存的(无论谁先谁后都编...
  • rainyspring4540
  • rainyspring4540
  • 2017年01月05日 11:04
  • 705

java只使用try和finally不使用catch的原因和场景

JDK并发工具包中,很多异常处理都使用了如下的结构,如AbstractExecutorService,即只有try和finally没有catch。 class X { private fin...
  • aitangyong
  • aitangyong
  • 2014年07月26日 17:19
  • 4987

java中的异常以及 try catch finally以及finally的执行顺序

java try、catch、finally及finally执行顺序详解 1.为什么要用finally 先看一个没有finally的异常处理try-catch语句: 假设count...
  • QH_JAVA
  • QH_JAVA
  • 2013年10月21日 21:43
  • 14154

finally中使用return会吃掉catch中抛出的异常

如果把return和throw放在一起,直接会提示错误。"Unreachable statement"(无法被执行). 然而finally却可以成功骗过编译器让两者并存(是不是可以算是编译器的一个小b...
  • tiantiandjava
  • tiantiandjava
  • 2015年07月06日 17:30
  • 6133

关于 try catch finally的运行流程

在开始先介绍一下try catch  finally的基本运行流程。 在try语句块中,放入的是你感觉会出现错误的代码,在catch语句块中放入的就是如果try语句块中的代码抛出错误之后所要执行的代码...
  • Andy______
  • Andy______
  • 2016年08月02日 19:36
  • 1128

java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

前言: java 中的异常处理机制你真的理解了吗?掌握了吗? catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System....
  • Lu_Ca
  • Lu_Ca
  • 2016年08月11日 17:00
  • 8352

Java中try catch finally语句中含有return语句的执行情况(总结版)

在这里看到了try catch finally语句中含有return语句的几种总结情况,但其实解释的很含糊,而且并不全面。但有一点是可以肯定的,finally块中的内容会先于try中的 return...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月25日 23:06
  • 12940

Java中catch和throw同时使用

一应用背景        在实际应用中,处理异常往往需要更加复杂的处理——当一个异常出现时,单靠某个方法无法完全处理该异常,必须由几个方法协作才能完全处理该异常,也就是说,在异常出现的当前方法中,程序...
  • chengqiuming
  • chengqiuming
  • 2017年04月12日 09:51
  • 554

java里面try,catch,finally异常捕捉

java里面try,catch,finally异常捕捉程序块出现异常,需要用try,catch来捕捉,形如: try{ //代码区 }catch(Exception e){ //异常处理 }...
  • yizeshun
  • yizeshun
  • 2015年11月05日 15:21
  • 1605

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

情况1:try块中没有抛出异常try和finally块中都有return语句 public static int NoException(){ int i=10; try{ S...
  • aaoxue
  • aaoxue
  • 2013年01月23日 21:45
  • 12004
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA异常处理机制的个人理解(try catch throw finally)
举报原因:
原因补充:

(最多只允许输入30个字)