关于finally关键字,一直知道,finally代码块里面的代码是肯定会执行的。
但是,对于里面有return的,还是想问问
代码如下static int test(){
try {
System.out.println("try");
return 1;
} finally{
System.out.println("finally");
return 2;
}
}最后代码返回的是2。我再试了一下抛异常的,结果也是抛finally的异常。
代码如下static void testFinally() throws Exception{
try {
throw new Exception("try");
} finally{
throw new Exception("finally");
}
}最后抛出的异常是finally我现在想知道的是,代码执行到try代码块的时候,有return语句或者throw语句,怎么就不直接return?
是说jvm会先看看有没有finally代码块?有的话就不return了,而是执行finally代码块里面的代码?--------
在发帖中,我也在想。是不是因为,如果在try里面直接return或者throw,finally里面的代码就执行不了了?
但是,对于里面有return的,还是想问问
代码如下static int test(){
try {
System.out.println("try");
return 1;
} finally{
System.out.println("finally");
return 2;
}
}最后代码返回的是2。我再试了一下抛异常的,结果也是抛finally的异常。
代码如下static void testFinally() throws Exception{
try {
throw new Exception("try");
} finally{
throw new Exception("finally");
}
}最后抛出的异常是finally我现在想知道的是,代码执行到try代码块的时候,有return语句或者throw语句,怎么就不直接return?
是说jvm会先看看有没有finally代码块?有的话就不return了,而是执行finally代码块里面的代码?--------
在发帖中,我也在想。是不是因为,如果在try里面直接return或者throw,finally里面的代码就执行不了了?
解决方案 »
- Java 进度条 显示出问题
- 紧急求助:WebSphere MQ的事务管理问题,解决马上结贴
- java连接数据库出问题,还有向表中插入变量时的VALUES格式。 高手请指点
- 这个二维数组定义哪错了?老是报“需要'['”
- jbuilder7中怎么解决鼠标滚动?怎么注释选中的多行,怎么撤销注释的多行(快捷键)?
- 请问如何判断一个字符串是否为另一个的子串?
- 最近访问google怎么这么慢啊?
- 请问各位大侠有没有防止class被反编译的方法?多多益善
- Vector not found,怎么回事??
- 求救!我的jbuilder4企业版~
- 在加载Hibernate配置文件时抛出异常,我是刚学的Java,请大家帮我看看是哪出了问题?
- TreeSet集合框架的问题;麻烦解答下;谢谢
try里面的return 语句是会先于finally代码块执行的
代码如下
static int test(){
try {
System.out.println("try");
return print();
} finally{
System.out.println("finally");
return 2;
}
}
static int print(){
System.out.println("print");
return 1;
}
//输出结果是
//try
//print
//finally
//2
finally代码块里的内容确实是必然执行的。
你这个代码里之所以会有try里的return是因为return print()先执行了print(),
这时会打印print,然后执行return的时候因为发现有finally,所以会在return之前执行finally中的return。而try中的return并没有执行。
如果里面有return语句会覆盖掉前面的返回值,而且如果前面语句抛出了的异常也会别覆盖!!!
try {
System.out.println("try");
return print(1);
} finally {
System.out.println("finally");
return print(2);
}
} static int print(int i) {
System.out.println("print:" + i);
return i;
}
public static void main(String[] args) {
int i = test();
System.out.println(i);
}
}
嗯,我试试你这个是从哪里看的?看起来有点道理,想确认一下是不是权威说法
其实像这些说法没有什么权威不权威的,很简单,还是那句话,自己写个简单程序debug一下是最好的,比别人说10句都管用,而且还记忆深刻。
public class Test1 {
public static void main(String[] arg) throws Exception{
System.out.println(test());
}static int test(){
int i = 0;
try {
System.out.println("try");
return ++i;
} finally{
System.out.println("finally");
return ++i;
}
}
}
从这个代码的结果是2和lz的static int test(){
try {
System.out.println("try");
return 1;
} finally{
System.out.println("finally");
return 2;
}
}可以看出try中return无论如何都先于finally执行,只是没最后return的是finally里的