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、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return ...
即使在`try`或`catch`块中有return语句,`finally`块的代码也会被执行。 5. **多层嵌套** 你还可以在`try-catch-finally`结构内部嵌套另一个`try-catch-finally`结构,以处理更复杂的情况。这种方式使得异常处理...
标题 "try-catch-finally-return-in-finally.rar_return" 提到了 `try-catch-finally` 结构与 `return` 语句的交互,这涉及到程序执行流程的关键方面。 `try` 块是用来包含可能会抛出异常的代码。如果在 `try` 块中...
即使`try`或`catch`块中存在`return`语句,`finally`块的代码也会被执行。这确保了程序的整洁和资源的有效管理。 在Java中,`try-catch-finally`结构可以单独使用,也可以嵌套使用。嵌套的`try-catch-finally`允许...
首先,需要了解的是,在 try-finally 或者 catch-finally 中,如果 try 或者 catch 中有 return 语句,则 finally 中的代码一定会执行,并且是在 return 前执行的。如果 finally 中也有 return 语句,那么finally 中...
try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
try-catch-finally语句是Java语言中一种常用的异常处理机制,当程序在执行过程中出现异常时,可以使用try-catch-finally语句来捕获和处理异常。下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try...
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
在这个过程中,函数会将`try`或`catch`块中的`return`语句返回的值暂存起来,然后执行`finally`块。 如果在`finally`块中也有`return`语句,那么这个`return`值会覆盖之前暂存的值。也就是说,最终返回给调用者的值...
本示例中的"trycatch.zip"文件内容就是展示了如何在Golang中模拟`try...catch`和`try...catch...finally`。 Golang的核心错误处理方式是通过返回错误值。通常,函数会返回一个错误值,如果在执行过程中遇到问题,就...
即使在`try`或`catch`块中有`return`语句,`finally`块的代码也会被执行。 ```csharp finally { // 无论是否发生异常都会执行的代码 } ``` 在示例中,无论`j`的值是否为0,`finally`块的`Console.WriteLine(j....
"Java中try finally return语句的执行顺序浅析" 关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是...
在这个例子中,无论`try`或`catch`块中的`return`语句如何,`finally`块都会执行,确保文件流被关闭。 总的来说,Java的`finally`语句块确保了关键代码的执行,尤其是在处理异常或资源清理的情况下。理解`finally`...
第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回) 第二:finally里面不建议放return语句,根据需要,return语句...
即使在`try`或`catch`块中有`return`语句,`finally`块中的代码也会被执行: ```java try { // 代码 } catch (ExceptionType1 e1) { // 处理 } catch (ExceptionType2 e2) { // 处理 } finally { // 清理资源,...
2. 如果`finally`块有`return`语句,无论`try`块是否包含`return`,`finally`块的`return`语句都将决定最终的返回值,因为`finally`总是被执行。 理解这一点对于编写健壮、可靠的Java代码至关重要,特别是涉及资源...
在Java中,finally语句可以与return语句结合使用,但是它们的执行顺序是非常重要的。finally语句是在try的return语句执行之后,return返回之前执行的。这意味着,如果在try块中执行了return语句,finally语句将在...
Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。
通过实验和示例,我们可以证明 finally 语句是在 try 的 return 语句执行之后,return 返回之前执行的。 在下面的示例中,我们可以看到 finally 语句是在 try 的 return 语句执行之后,return 返回之前执行的。 ``...