先return然后finally,如:
public class myClass{
public static void main(String args[]) {
try{
Integer.parseInt("1");
return;
}catch(Exception e) {}
finally {
System.out.println("finally");
}
}
}
public class myClass{
public static void main(String args[]) {
try{
Integer.parseInt("1");
return;
}catch(Exception e) {}
finally {
System.out.println("finally");
}
}
}
但我觉得不管是先return还是先finally,对于你在调用完这个方法后,finally是肯定已经执行了。结果对你而言都是一致的。我用下面的测试用例得出的就是:
begin...
finally
end.public class myTest{
static String str="";
public static void main(String args[]) {
System.out.println("begin...");
test();
System.out.println(str);
System.out.println("end.");
}
public static void test(){
try{
Integer.parseInt("1");
str="return";
return;
}catch(Exception e) { }finally {
str="finally";
}
}
}
先return 后finally.
事实就是这样,也应该是这样。
比如说对数据库的操作,先try,返回数据集,操作完毕后catch异常,然后在finally中关闭数据库的连接,如果先finally,关闭了连接,然后再返回数据集的话,只能返回一个空值,那你的try岂不是白做了。
static String str="";
public static void main(String args[]) {
System.out.println("begin...");
System.out.println(test());
System.out.println("end.");
}
public static boolean test(){
boolean result = true;
try{
System.out.println("before return.....");
return result; //----->返回的true,finally的确执行了,但并没有修改掉result。
}catch(Exception e) {
return false;
}finally {
System.out.println("in finally.....");
result = false;
// return result; ----->如果在finally中同样有return,将执行finnaly中的return,忽略try,catch中的return.
}
}
}
如果finnaly中没有return,屏幕输出为:
begin...
before return.....
in finally.....
true
end.
如果finnaly中有return,屏幕输出为:
begin...
before return.....
in finally.....
false
end.
import java.io.*;public class a{
public a(){System.out.println(hello());}
public boolean hello(){
try{
return true;
}
finally{
System.out.println("finally is first!");
}
}
public static void main(String[] args){
a a1 = new a();
}
}
输出:finally is first!
true
你的程序说明不了任何问题,无论先执行finally或先执行return结果是一样的。
程序从上到下,先运行try代码块,出错时转到catch块,当遇到return语句的时候查找finally代码块,然后运行它,最后return返回
呵呵,返回结果集是直接用return rs吗?事实上如要返回数据集,并且在该方法中要关闭连接的话,是必须要把结果集读出来,或者用sun提供的一个rowset补丁包才可以做到。To xiao_yuer(小鱼儿):
完全正确。
ps:当然不能两次return阿,那会要它听谁的呢。编译的时候就会将try中的return去掉的。
顺便问一下,是余工吗?呵呵
的确只能有一次return.我那段意思就是finnaly中除了System.exit()以外,还有一个return语句会导致try中return语句不执行,不过是不是编译的时候就把try中去掉了,这就不清楚了。但我觉得奇怪的是,finnaly的确应该是先执行(书上云),但为什么我在finnaly中对result进行的修改却不起作用呢?
try{
System.out.println("before return.....");
return result; //----->返回的true,finally的确执行了,但并没有修改掉result。
}catch(Exception e) {
return false;
}finally {
System.out.println("in finally.....");
result = false;
}
public static boolean test(){
boolean result = true;
try{
System.out.println("before return...result=" + result);
return result; //----->返回的true,finally的确执行了,但并没有修改掉result。
}catch(Exception e) {
return false;
}finally {
result = false;
System.out.println("in finally...result=" + result);
//return result; //----->如果在finally中同样有return,将执行finnaly中的return,忽略try,catch中的return.
}
}
//: c10:FinallyWorks.java
// The finally clause is always executed.
import com.bruceeckel.simpletest.*;class ThreeException extends Exception {}public class FinallyWorks {
static int count = 0;
public static void main(String[] args) {
SimpleTest monitor =
new SimpleTest("FinallyWorks");
while(true) {
try {
// Post-increment is zero first time:
if(count++ == 0)
throw new ThreeException();
System.out.println("No exception");
} catch(ThreeException e) {
System.err.println("ThreeException");
} finally {
System.err.println("In finally clause");
if(count == 2) break; // out of "while"
}
}
monitor.expect(new String[] {
"ThreeException",
"In finally clause",
"No exception",
"In finally clause"
});
}
} ///:~