1.不管有无异常,finally里的语句都会执行
(通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等 )
2.当try 或catch 块里有return语句时,finally仍会执行
3.finally语句里不能包含return语句(实践证明可以包含,但是需要加上@SuppressWarnings("finally"),当包含return时候,程序会到此为止,不再往下执行)
4.finally在return(不论是try或catch里的return)前执行,即执行finally,不会改变已经确定的return值 (即执行finally后再执行try或catch里的语句,return返回语句不受finally影响,感官上是return前好像没有执行finally).
代码一
import java.io.*;
public class Mine{
public static void main(String argv[]){
Mine m=new Mine();
System.out.println(m.amethod());
}
public int amethod(){
try{
FileInputStream dis =new FileInputStream("Hello.txt");[color=red] //1,抛出异常[/color]
}catch ( Exception ex) {
System.out.println("No such file found"); [color=red]//2.catch捕获异常,并执行[/color]
return -1; [color=red]//4,return 返回[/color]
}finally{
System.out.println("Doing finally"); [color=red]//3.finally一定会执行,在return之前。[/color]
}
return 0;
}
}
运行结果:
C:\java>java Mine
No such file found
Doing finally
-1
运行顺序是1.2.3.4
如果在finnally写入return,则程序到此终止,不在执行4即是不在返回-1
代码二
public class Test {
int a;
public int amethod() {
try {
System.out.println("mmmm");//1.此处没有异常,所以不再走catch,
return a; //3.return返回0
} catch (Exception ex) {
return a;
} finally {
a++;
System.out.println(a); // 2.finally一定会执行,在return之前。此处输出1
}
}
public static void main(String argv[]) {
Test m = new Test();
System.out.println(m.amethod());
}
}
运行结果:
mmmm
1
0
finally 块会在return之前执行
代码三:
try{
System.out.println("hello world");
System.exit(0);
}catch(RuntimeException e){
e.printStackTrace();
}finally{
System.out.println("goodbye world");
}
输出结果: hello world
finally 块不会被执行
如果用
System.exit(0);这个是系统强制退出,没辙,肯定会退出去,不会执行下面的finally
API文档上描述System.exit方法会导致当前运行线程停止并使其它线程都终止,因此上面这段代码中的finally代码块不会被执行
进一步探索System.exit被调用后的行为,它在虚拟机退出之前会执行两个清除任务。第一,它会执行所有通过Runtime.addShutdownHook注册的shutdown hooks它能有效的释放JVM之外的资源。第二,执行清除任务,运行相关的finalize方法终结对象。
如果需要在调用System.exit方法后仍然打印出“goodbye world”,可采用如下方法
try {
System.out.println("Hello World");
Runtime.getRuntime().addShutdownHook(
new Thread(){
public void run(){
System.out.println("Goodbye World");
}
}
);
System.exit(0);
} catch (RuntimeException e) {
e.printStackTrace();
}finally{
System.out.println("Goodbye World");
}
try 要么和catch一起,要么和finaly一起,不能独立使用,例如
try{
System.out.println(33);
}
这样写是不对的。
最后还应该注意一下异常处理的语法规则:
第一、try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。
第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。
第四、throw语句后不允许有紧跟其他语句,因为这些没有机会执行。
第五、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。(第五点不是很懂)
Java异常处理的原则和技巧
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况
下面这篇博客总结的也不错
http://www.blogjava.net/fancydeepin/archive/2012/07/08/java_try-catch-finally.html
分享到:
相关推荐
try、catch、finally、return 执行顺序超详细讲解,包看包会。
try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
首先执行try,如果有异常执行catch,无论如何都会执行finally,当有return以后,函数就会把这个数据存储在某个位置,然后告诉主函数,我不执行了,接下来你执行吧,所以函数就会推出
第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回) 第二:finally里面不建议放return语句,根据需要,return语句...
The production IfStatement : if ( Expression ) Statement else Statement is evaluated as follows:.
Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。
我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种...
finally 一定会被执行,如果 finally 里有 return 语句,则覆盖 try/catch 里的 return , 比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种...
- 无论try是否发生异常,finally语句都会执行- 如果try/catch中包含控制转移语句(return、continue、break),finally
3. 但是如果有 finally块的话,那么,finally 几乎是必定会执行的,但是这里有一个先后顺序的问题,应该是 finally 块和 打印异常堆栈将会在另外一个线程之中执行,所以 打印的顺序就很有意思了。 4. 如果在try或者...
主要介绍了关于java中的一道面试题,这套题就是在try中含return语句时代码的执行顺序,这个问题看似简单,却暗藏杀机啊!文中通过一个个例子详细介绍了其中玄机,需要的朋友可以参考学习,下面来一起看看吧。
在一个try………end try 过程中可以使用catch与finally两个中的一 个,或者两个一起用, 二:Protected, private, Public 封装控制 这三个关键字一般放在语句最前面,而会置于overloads与Overrides的 后面...
@SuppressWarnings(finally) static int compute (){ Exc e = new Exc(); e.a = 10; e.b = 10; int res = 0 ; try{ res = e.a / e.b; System.out.println(try ……); return res + 1; }catch...
异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try … catch … finally来处理异常,在Python中通过try … except … else来处理异常 一、以ZeroDivisionError为例,处理分母为...
实验指导书 实验名称:包、接口与异常处理 学时安排:2 实验类别:综合设计型实验 实验要求:1人1组  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 一、实验目的 1、掌握java字符串处理...
8. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 9. 类 ExampleA 继承 Exception,类 ExampleB 继承ExampleA。 10. 常见的 RuntimeException 有哪些? 11. Java常见异常有哪些 四、并发...
ublic SqlConnection lianjie()//数据库链接 { ... try { com.ExecuteNonQuery();//执行sql命令 return true; } catch { return false; } finally { con.Close();//关闭数据库 }
03 try-catch优化为try-catch-finally简化 04 辅助功能-return简写表达式还原,便于阅读理解 05 新增:大数组多解密函数(需要先自行排版,大数组-偏移函数-解密函数1-解密函数2-解密函数3) 06 修复bug-未修改常量...