好记性不如一个烂笔头
一般情况下finally块中的代码是一定会被执行,除非JVM停止工作。
1.返回基础数据类型
(1)try块中不抛出异常的情况下
public static String getString(){
String info;
try {
info ="i am try ";
System.out.println(info);
return info;
}catch (Exception e){
info="i am catch ";
System.out.println(info);
return info;
}finally {
info = "i am finally";
System.out.println(info);
return info;
}
}
public static void main(String[] args){
String i = getString();
System.out.println("i am main = "+i);
}
运行结果:
(2)try块抛出异常
public static String getString(){
String info;
try {
info = "i am try ";
//制造异常
int j = 1/0;
System.out.println(info);
return info;
}catch (Exception e){
info="i am catch ";
System.out.println(info);
e.printStackTrace();
return info;
}finally {
info = "i am finally";
System.out.println(info);
return info;
}
}
运行结果:
(3)finally块中没有return
public static String getString(){
String info;
try {
info = "i am try ";
System.out.println(info);
return info;
}catch (Exception e){
info="i am catch ";
System.out.println(info);
e.printStackTrace();
}finally {
info = "i am finally";
System.out.println(info);
}
return info;
}
运行结果:
2.返回引用数据类型
public static StringBuilder getSb(){
StringBuilder info = new StringBuilder();
try {
info.append("i am try ");
System.out.println(info.toString());
return info;
}catch (Exception e){
info.append("i am catch ");
System.out.println(info.toString());
e.printStackTrace();
return info;
}finally {
info.append("i am finally");
System.out.println(info.toString());
return info;
}
}
(1)try块中不抛出异常的情况下
(3)finally块中没有return
public static StringBuilder getSb(){
StringBuilder info = new StringBuilder();
try {
int j = 1/0;
info.append("i am try ");
System.out.println(info.toString());
return info;
}catch (Exception e){
info.append("i am catch ");
System.out.println(info.toString());
e.printStackTrace();
}finally {
info.append("i am finally");
System.out.println(info.toString());
}
return info;
}
运行结果和(2)运行一致
这里不再贴代码,由于返回值是引用类型,所以这3种情况下,函数的最终结果是数据的“叠加”。 try,catch,finally中可以同时都出现return,一旦return写在最后,要么在try,catch,finally都不写return,要么在try中写return,才能通过编译。需要特别注意的是,基本数据类型(就不再强行用内存解释了),简单点记忆就是基本数据类型返回值是“覆盖”,引用类型是“叠加”