首先要搞清 try catch 和finally三者的概念,在你的程序中,尤其应该注意finally, finally指的是无论出现异常与否都必须执行的代码,这个是在java中所规定的。 因此在代码中, 必须执行finally中的代码(只有一种情况例外,那就是在try或者catch中强行终止JVM,才不会运行finally中的代码)。有了上面这点认识,再来看你的方案:
在方案1中,因为你的finally中包含了return语句,因此执行到这条语句时,就直接退出方法g,那么这时候就把异常给屏蔽了而在方案2中,因为return语句在try catch finally之外,那么执行完了finally中的语句之后,因为这时候在catch中存在着抛出异常未被捕获的异常,因此方法g抛出异常在方案3中,因为finally中抛出了异常,因此在执行到finally中的异常抛出语句时,方法直接抛出异常退出。异常的处理是很复杂的,如果有兴趣可以看看《effective Java》这本书(书的名字不确定,呵呵)
在方案1中,因为你的finally中包含了return语句,因此执行到这条语句时,就直接退出方法g,那么这时候就把异常给屏蔽了而在方案2中,因为return语句在try catch finally之外,那么执行完了finally中的语句之后,因为这时候在catch中存在着抛出异常未被捕获的异常,因此方法g抛出异常在方案3中,因为finally中抛出了异常,因此在执行到finally中的异常抛出语句时,方法直接抛出异常退出。异常的处理是很复杂的,如果有兴趣可以看看《effective Java》这本书(书的名字不确定,呵呵)
解决方案 »
- JMAIL相关、一般网站注册邮件确认是怎么处理的?
- jquery 难题啊!
- 请问maven2怎样配置使它指向的web目录不是src/main/webapp 而是WebRoot,src/main/java变成src/main
- 当前窗口关闭,刷新父窗口
- java 中把Blob(txt文件)写入oracle10G中
- 怎样正确关闭一个PreparedStatement?
- 我要上传图片文件到数据库的JavaBean,谢谢
- form提交的参数问题?
- 急!大家帮忙,网页跳转
- 请教一个hibernate 误操作后的问题??
- 同样的代码为什么在tomcat4.1.27上好使,在tomcat5.0上就不能用呢?
- tomecat5.5中直接将根目录指到我的文件夹应该如何设置?
static void g(){
int i = 0;
try{
System.out.println(++i);
throw new Exception();
}catch(Exception e){
System.out.println(++i);
return; //1
//System.exit(0); //2
}
finally{
System.out.println(++i);
}
}
public static void main(String[] args)throws Exception{
j=g();
}
}
第二种情况刚是正常途径
1)将①处注释掉,并去掉②处的注释再试试看,会有什么结果!
Has Exception:This Exception is in f1()
2)谁能解释解释方案1为什么不能抛处错误?方案2为什么又能抛出错误呢?
Java异常处理作用域有关。
3)去掉finally中/**/注释的部分,抛出哪个异常?
This Exception is in f2()
int i = 0;
try{
f1();
}catch(Exception e){
i = 1;
throw e;
}
finally{
i = 2;
/*
try{
f2();
}catch(Exception e){
throw e;
}
*/
return i;//此处为①
}
//return i;//此处为②
}
Not Exception------------------------------------
static int g() throws Exception{
int i = 0;
try{
f1();
}catch(Exception e){
i = 1;
throw e;
}
finally{
i = 2;
try{
f2();
}catch(Exception e){
throw e;
}
return i;//此处为①
}
//return i;//此处为②
}This Exception is in f2()
-------------------------------
static int g() throws Exception{
int i = 0;
try{
f1();
}catch(Exception e){
i = 1;
throw e;
}
finally{
i = 2;
/*
try{
f2();
}catch(Exception e){
throw e;
}
*/
//return i;//此处为①
}
return i;//此处为②
}This Exception is in f1()
-------------------------不知道我对不对?
再问个问题,try.catch.finally结构中流程是怎么样的?
那个简单的来说如果try中出现异常,是先执行完catch块然后再执行finally块呢?如果先执行完catch块,那么执行throw e;的时候,显然要直接退出方法g了,这肯定有问题!
我认为流程是,先执行完catch的一部分(不包括退出方法的那部分),然后执行finally中的全部,如果finally中有退出方法的部分,就直接退出该方法而忽略catch中退出方法的部分,如果finally中不包括退出方法的部分,就返回到catch中退出方法的部分继续执行(比如说你的程序)。
不过,JAVA中是怎么实现的呢?catch中退出方法的部分保存再那里?
另外:你的程序写的也太。实在不应该,要敬业哦!!
1:Not Exception
j = 2
2:Has Exception:This Exception is in f1()
3:Has Exception:This Exception is in f2()
而那条注释的System.exit(0)则是一条强行终止程序执行的语句,当出现这条语句时,才不会运行finally中的语句。
1)将①处注释掉,并去掉②处的注释再试试看,会有什么结果!
Not Exception
j=2
2)谁能解释解释方案1为什么不能抛处错误?方案2为什么又能抛出错误呢?
try catch finally 中不论try catch是否抛出异常或return,最终都要执行finally中的语句的
3)去掉finally中/**/注释的部分,抛出哪个异常?
This Exception is in f2()
tangqs(leon_tangqs)
你的例子去掉1处注释应该输出 1 2 3
去掉2处注释应该输出 1 2
佩服佩服。。~
TestException.java:27: unreachable statement
return i;//此处为②