[color=red] [size=medium]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).
[/size]
[/color]
[b]代码一[/b]
运行结果:
C:\java>java Mine
No such file found
Doing finally
-1
运行顺序是1.2.3.4
[color=red]如果在finnally写入return,则程序到此终止,不在执行4即是不在返回-1[/color]
[b]
代码二[/b]
运行结果:
mmmm
1
0
[color=red]finally 块会在return之前执行[/color]
[b]代码三:[/b]
输出结果: hello world
finally 块不会被执行
如果用[color=red]System.exit(0);这个是系统强制退出[/color],没辙,肯定会退出去,不会执行下面的finally
API文档上描述System.exit方法会导致当前运行线程停止并使其它线程都终止,因此上面这段代码中的finally代码块不会被执行
进一步探索System.exit被调用后的行为,它在虚拟机退出之前会执行两个清除任务。第一,它会执行所有通过Runtime.addShutdownHook注册的shutdown hooks它能有效的释放JVM之外的资源。第二,执行清除任务,运行相关的finalize方法终结对象。
如果需要在调用System.exit方法后仍然打印出“goodbye world”,可采用如下方法
[color=red]try 要么和catch一起,要么和finaly一起,不能独立使用,例如
try{
System.out.println(33);
}
这样写是不对的。[/color]
最后还应该注意一下异常处理的语法规则:
[color=blue]第一、try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。
第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。
第四、throw语句后不允许有紧跟其他语句,因为这些没有机会执行。[/color]
第五、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。(第五点不是很懂)
[b]Java异常处理的原则和技巧[/b]
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
(通常在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).
[/size]
[/color]
[b]代码一[/b]
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
[color=red]如果在finnally写入return,则程序到此终止,不在执行4即是不在返回-1[/color]
[b]
代码二[/b]
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
[color=red]finally 块会在return之前执行[/color]
[b]代码三:[/b]
try{
System.out.println("hello world");
System.exit(0);
}catch(RuntimeException e){
e.printStackTrace();
}finally{
System.out.println("goodbye world");
}
输出结果: hello world
finally 块不会被执行
如果用[color=red]System.exit(0);这个是系统强制退出[/color],没辙,肯定会退出去,不会执行下面的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");
}
[color=red]try 要么和catch一起,要么和finaly一起,不能独立使用,例如
try{
System.out.println(33);
}
这样写是不对的。[/color]
最后还应该注意一下异常处理的语法规则:
[color=blue]第一、try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。
第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。
第四、throw语句后不允许有紧跟其他语句,因为这些没有机会执行。[/color]
第五、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。(第五点不是很懂)
[b]Java异常处理的原则和技巧[/b]
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