java中使用try catch finally做异常处理的情形较为常见,关于执行具体不同情况下的执行流程,在另一篇帖子中看到,说明较为详细,但例子没看太懂,故用自己的代码做贴留念。
以下内容在‘假设方法需要返回值’的前提下,如没有此前提,便没有探究执行流程的必要。
主要代码(通过加注释达到不同情况):
public class Hello {
public static void main(String[] args){
System.out.println(tryCatchTest());
}
public static String tryCatchTest(){
try {
int i = 1 / 0; //引发异常的语句
System.out.println("try 块中语句被执行");
return "try 块中语句 return";
}
catch (Exception e){
System.out.println("catch 块中语句被执行");
return "catch 块中语句 return";
}
finally {
System.out.println("finally 块中语句被执行");
return "finally 块中语句 return";
}
}
}
情况种类(忽略catch语句)
- 如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;
- 如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,
2.1 若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;
2.2 若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。
代码演示:
情况1
public class Hello {
public static void main(String[] args){
System.out.println(tryCatchTest());
}
public static String tryCatchTest(){
try {
// int i = 1 / 0; //引发异常的语句
System.out.println("try 块中语句被执行");
return "try 块中语句 return";
}
catch (Exception e){
System.out.println("catch 块中语句被执行");
return "catch 块中语句 return";
}
// finally {
// System.out.println("finally 块中语句被执行");
// return "finally 块中语句 return";
// }
}
}
结果
try 块中语句被执行
try 块中语句 return
情况2.1
public class Hello {
public static void main(String[] args){
System.out.println(tryCatchTest());
}
public static String tryCatchTest(){
try {
// int i = 1 / 0; //引发异常的语句
System.out.println("try 块中语句被执行");
return "try 块中语句 return";
}
catch (Exception e){
System.out.println("catch 块中语句被执行");
return "catch 块中语句 return";
}
finally {
System.out.println("finally 块中语句被执行");
// return "finally 块中语句 return";
}
}
}
结果
try 块中语句被执行
finally 块中语句被执行
try 块中语句 return
情况2.2
public class Hello {
public static void main(String[] args){
System.out.println(tryCatchTest());
}
public static String tryCatchTest(){
try {
// int i = 1 / 0; //引发异常的语句
System.out.println("try 块中语句被执行");
return "try 块中语句 return";
}
catch (Exception e){
System.out.println("catch 块中语句被执行");
return "catch 块中语句 return";
}
finally {
System.out.println("finally 块中语句被执行");
return "finally 块中语句 return";
}
}
}
结果
try 块中语句被执行
finally 块中语句被执行
finally 块中语句 return
如果有catch
块,基本和上面情况相似,只不过是把catch
块续到try
块引发异常语句后面,finally
的地位依旧。