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,第一次写技术博客。如有错误欢迎指出~

一片全面介绍Script Encoding加密的文章,很全面可惜是E文的(那位个哥们e文好翻译一下)

Script Encoding with the Microsoft Script Engine Version 5.0 Andrew Clinick Tired of exposing your W...
  • ghj1976
  • ghj1976
  • 2000-08-31 09:55:00
  • 1649

Java异常处理机制 try-catch-finally

异常处理机制入门理解
  • qq_25827845
  • qq_25827845
  • 2016-04-06 17:34:01
  • 2930

Try...catch...finally与直接throw的区别

public class ZeroTest {     public static void main(String[] args) {      try{        int ...
  • sunshineboy_oO
  • sunshineboy_oO
  • 2015-10-08 17:02:39
  • 1347

Java异常类简介以及throws,try,catch,throw,finally的区别

1.异常简介在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。 Throwa...
  • cuiyaoqiang
  • cuiyaoqiang
  • 2016-05-04 14:22:34
  • 877

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

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

JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗?

Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并   提供了良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或 其它子类的实例。当一个方...
  • uniquewonderq
  • uniquewonderq
  • 2015-06-09 14:25:35
  • 3512

Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别代表什么意义?在try块中可以抛出异常吗?

try块表示程序正常的业务执行代码。如果程序在执行try块的代码时出现了“非预期”情况,JVM将会生成一个异常对象,这个异常对象将会被后面相应的catch块捕获。 catch块表示一个异常捕获块。当...
  • CWH615
  • CWH615
  • 2016-10-28 11:07:27
  • 5748

【面试加分项】java异常处理之try_catch_finally

try_catch_finally大家应该用的很多,不少人也了解一些他们的执行顺序,可是它真的有这么简单么?今天让我们一起来看看...
  • u010590685
  • u010590685
  • 2015-07-28 20:30:18
  • 4751

JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的 接口。在Java中,每个异常都是一个对象,它是Throwable类或其它子类的实例。当一 个方法出现异常后...
  • u014617239
  • u014617239
  • 2016-08-14 19:58:33
  • 1289

Java的异常处理——try-catch-finally-throw-throws

大一大二写了写了两年C++,没有使用过异常处理机制。现在大三上学期学Java,我要彻底弄清楚异常处理是怎么弄的。...
  • u013390476
  • u013390476
  • 2015-12-31 12:49:32
  • 1931
收藏助手
不良信息举报
您举报文章:JAVA异常处理机制的个人理解(try catch throw finally)
举报原因:
原因补充:

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