Java中finally和return的關(guān)系實(shí)例解析
本文研究的主要是Java中finally和return的關(guān)系,具體介紹和實(shí)例如下所示。
finally 和 return 關(guān)系的總結(jié)
1.try塊中有System.exit(0)這樣的語句,由于它是終止Java虛擬機(jī)JVM的,連JVM都停止了,所有都結(jié)束了,當(dāng)然finally語句也不會(huì)被執(zhí)行到。
2.其它情況下,finally語句都必然會(huì)被執(zhí)行。因此可以在這里執(zhí)行一些資源的釋放操作。
(1)finally中的return會(huì)覆蓋try/catch中的renturn。
(2)在finally中寫return語句會(huì)有警告,因?yàn)樗鼤?huì)阻止函數(shù)拋出異常,而改為正常返回。
package com.demo.test;
public class FinallyAndReturn {
private static void finallyAndTryReturn() {
try {
System.out.println("finallyAndTryReturn -> try");
return;
}
catch (Exception e) {
System.out.println("finallyAndTryReturn -> catch");
}
finally {
System.out.println("finallyAndTryReturn -> finally");
}
}
private static void finallyAndCatchReturn() {
try {
System.out.println("finallyAndCatchReturn -> try");
throw new Exception();
}
catch (Exception e) {
System.out.println("finallyAndCatchReturn -> catch");
return;
}
finally {
System.out.println("finallyAndCatchReturn -> finally");
}
}
// finally語句是在try的return語句執(zhí)行之后,return返回之前執(zhí)行。
private static String tryReturn() {
String str = "initialized";
try {
System.out.println("tryReturn -> try");
str = "try";
return str;
}
catch (Exception e) {
System.out.println("tryReturn -> catch");
str = "catch";
}
finally {
System.out.println("tryReturn -> finally");
str = "finally";
}
return null;
}
private static String tryReturnAndFinallyReturn() {
String str = "initialized";
try {
System.out.println("tryReturnAndFinallyReturn -> try");
str = "try";
return str;
}
catch (Exception e) {
System.out.println("tryReturnAndFinallyReturn -> catch");
str = "catch";
}
finally {
System.out.println("tryReturnAndFinallyReturn -> finally");
/*
* Warning: finally block does not complete normally
* 如果finally塊中包含了return語句,即使前面的catch塊重新拋出了異常,則調(diào)用該方法的語句也不會(huì)獲得catch塊重新拋出的異常,而是會(huì)得到finally塊的返回值,并且不會(huì)捕獲異常。
*/
str = "finally";
return str;
}
}
private static String tryThrowAndFinallyReturn() throws Exception {
String str = "initialized";
try {
System.out.println("tryThrowAndFinallyReturn -> try");
str = "try";
throw new Exception();
}
catch (Exception e) {
System.out.println("tryThrowAndFinallyReturn -> catch");
str = "catch";
throw new Exception();
}
finally {
System.out.println("tryThrowAndFinallyReturn -> finally");
/*
* Warning: finally block does not complete normally
* 如果finally塊中包含了return語句,即使前面的catch塊重新拋出了異常,則調(diào)用該方法的語句也不會(huì)獲得catch塊重新拋出的異常,而是會(huì)得到finally塊的返回值,并且不會(huì)捕獲異常。
*/
str = "finally";
return str;
}
}
private static void finallyAndRuntimeException() {
try {
System.out.println("finallyAndRuntimeException -> try");
throw new RuntimeException();
}
catch (Exception e) {
System.out.println("finallyAndRuntimeException -> catch");
}
finally {
System.out.println("finallyAndRuntimeException -> finally");
}
}
private static void finallyAndExit() {
try {
System.out.println("finallyAndExit -> try");
// System.exit(0);是終止Java虛擬機(jī)JVM的,連JVM都停止了,所有都結(jié)束了,當(dāng)然finally語句也不會(huì)被執(zhí)行到。
System.exit(0);
}
catch (Exception e) {
System.out.println("finallyAndExit -> catch");
}
finally {
System.out.println("finallyAndExit -> finally");
}
}
public static void main(String[] args) {
finallyAndTryReturn();
System.out.println();
finallyAndCatchReturn();
System.out.println();
System.out.println("tryReturn return -> " + tryReturn());
System.out.println();
System.out.println("tryReturnAndFinallyReturn return -> " + tryReturnAndFinallyReturn());
System.out.println();
try {
System.out.println("tryThrowAndFinallyReturn return -> " + tryThrowAndFinallyReturn());
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println();
finallyAndRuntimeException();
System.out.println();
finallyAndExit();
}
}
演示結(jié)果:

總結(jié)
以上就是本文關(guān)于Java中finally和return的關(guān)系實(shí)例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
java實(shí)現(xiàn)馬踏棋盤算法(騎士周游問題)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)馬踏棋盤算法,解決騎士周游問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
java實(shí)現(xiàn)簡單銀行ATM系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
intellij idea 2021.2 打包并上傳運(yùn)行spring boot項(xiàng)目的詳細(xì)過程(spring boot 2
這篇文章主要介紹了intellij idea 2021.2 打包并上傳運(yùn)行一個(gè)spring boot項(xiàng)目(spring boot 2.5.4),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)
一般我們在數(shù)據(jù)庫都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下2022-03-03
Java8深入學(xué)習(xí)系列(三)你可能忽略了的新特性
一提到Java 8就只能聽到lambda,但這不過是其中的一個(gè)而已,Java 8還有許多新的特性,有一些功能強(qiáng)大的新類或者新的用法,還有一些功能則是早就應(yīng)該加到Java里了,所以下面這篇文章主要給大家介紹了關(guān)于Java8中大家可能忽略了的一些新特性,需要的朋友可以參考下。2017-08-08
IntelliJ?IDEA運(yùn)行SpringBoot項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了IntelliJ?IDEA如何運(yùn)行SpringBoot項(xiàng)目,步驟一配置maven,步驟二配置JDK環(huán)境,緊接著通過步驟三檢查數(shù)據(jù)庫的配置,最后一步數(shù)據(jù)庫連接,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

