原 try catch finally的执行顺序
版权声明:本文为博主原创文章,请尊重他人的劳动成果,转载请附上原文出处链接和本声明。
本文链接:https://www.91mszl.com/Dream/article/details/1197
情况一:代码演示。
package com.mszl.eq;
/**
* 功能:try catch finally的执行顺序
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
public class Test1 {
public static String test(int i) {
int num = 10;
try {
num = num / i;
return "try 块 " + num;
} catch (Exception e) {
num = num + 50;
return "fail 块 " + num;
} finally {
num = num + 100;
System.out.println("finally 块 " + num);
}
}
public static void main(String[] args) {
System.out.println(Test1.test(5));
System.out.println(" >>>>>>>>>>>>>>>> ");
System.out.println(Test1.test(0));
}
}
执行结果
finally 块 102
try 块 2
>>>>>>>>>>>>>>>>
finally 块 160
fail 块 60
总结:
1)try最先被执行,其次在执行finally,在没有异常的情况下,最后在执行try里面的return。
2)try最先被执行,在有异常的情况下,其次在执行catch,在执行finally,最后在执行catch里面的return。
情况二:代码演示。
package com.mszl.eq;
/**
* 功能:try catch finally的执行顺序
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
public class Test1 {
public static String test(int i) {
int num = 10;
try {
num = num / i;
return "try 块 " + ++num;
} catch (Exception e) {
num = num + 50;
return "fail 块 " + ++num;
} finally {
num = num + 100;
System.out.println("finally 块 " + ++num);
}
}
public static void main(String[] args) {
System.out.println(Test1.test(5));
System.out.println(" >>>>>>>>>>>>>>>> ");
System.out.println(Test1.test(0));
}
}
执行结果
finally 块 104
try 块 3
>>>>>>>>>>>>>>>>
finally 块 162
fail 块 61
情况三:代码演示。
public static void notice1(){
try{
int a=10;
int b=0;
int c=a/b;
System.out.println("notice1:" + c);
} catch (Exception ex){
System.out.println("notice1异常:" + ex);
}
}
public static void notice2(){
int a=10;
int b=0;
int c=a/b;
System.out.println("notice2:" + c);
}
public static void main(String[] args) {
try {
notice1(); // 事情1
notice2(); // 事情2
} catch (Exception ex) {
System.out.println("异常信息:" + ex);
} finally {
System.out.println("finally...");
}
}
执行结果:
notice1异常:java.lang.ArithmeticException: / by zero
异常信息:java.lang.ArithmeticException: / by zero
finally...
总结:
1)如果主方法(我们这里的main方法)里面有try catch,嵌套的方法(我们这里的notice1方法)里面也有try catch,如果发生异常,则由notice1方法里面的catch去处理异常,主方法(main方法),不会再进行处理。
2)如果主方法(我们这里的main方法)里面有try catch,嵌套的方法(我们这里的notice2方法),里面没有try catch对异常进行处理,如果notice2方法里面发生异常,则交给主方法(这里的main方法)的catch进行异常处理。
情况四:代码演示。
public static void sms1(){
try{
System.out.println("sms1...");
throw new RuntimeException("出现异常了。。。");
} finally{
System.out.println("sms1 finally");
}
}
public static void sms2(){
try{
System.out.println("sms2...");
} finally{
System.out.println("sms2 finally");
}
}
public static void main(String [] args){
try{
sms1();
System.out.println(" ------------ ");
sms2();
} catch(Exception e){
System.out.println("main exception...");
} finally{
System.out.println("main finally ...");
}
}
执行结果:
sms1...
sms1 finally
main exception...
main finally ...
备注:我们很好奇为什么没有输出 ”------------“ 和sms2方法里面打印的信息,因为我们在sms1方法里面进行了throw 程序被我们人为的中断了,后续的代码将不会被执行。
情况五:代码演示。
public static String calculation1(int i){
int num=10;
try{
num=num/i; // 语块1
return "calculation1 try... " + num; // 语块2
} catch (Exception ex){
num=num+20; // 语块3
return "calculation1 catch... " + num; // 语块4
} finally {
num=num+30; // 语块5
System.out.println("calculation1 finally num " + num); // 语块6
}
}
public static String calculation2(int i){
int num=10;
try{
num=num/i; // 语块1
return "calculation1 try... " + num; // 语块2
} catch (Exception ex){
num=num+20; // 语块3
return "calculation1 catch... " + num; // 语块4
} finally {
num=num+30; // 语块5
System.out.println("calculation1 finally num " + num); // 语块6
return "calculation1 over"; // 语块7
}
}
public static void main(String[] args) {
// 代码执行顺序:语块1; 语块5; 语块6; 语块2
String result1=Test10.calculation1(5); // demo1
System.out.println(result1);
System.out.println();
// 代码执行顺序:语块1; 语块3; 语块5; 语块6; 语块4
String result2=Test10.calculation1(0); // demo2
System.out.println(result2);
System.out.println();
// 代码执行顺序:语块1; 语块5; 语块6; 语块7
String result3=Test10.calculation2(5); // demo3
System.out.println(result3);
System.out.println();
// 代码执行顺序:语块1; 语块3; 语块5; 语块6; 语块7
String result4=Test10.calculation2(0); // demo4
System.out.println(result4);
}
总结:
1)当finally里面有return时,不论try或catch里面是否有return语句,都将不会被执行。注意看里面的代码执行顺序。
2020-04-02 20:06:52 阅读(628)
名师出品,必属精品 https://www.91mszl.com
博主信息