文章目錄
- 1.return陳述句執行順序
- 1.1finally陳述句是在return陳述句執行之后,return陳述句回傳之前執行的
- 2.覆寫問題
- 2.1finally塊中的return陳述句會覆寫try塊的return回傳
- 2.2如果finally陳述句沒有return陳述句覆寫回傳值,那么原來的回傳值可能因為finally里的修改而改變也有可能不變
- 3.例外情況
- 3.1try塊中的return陳述句在例外的情況下不會被執行
- 3.2try中發生例外時,return寫在catch陳述句中
- 4.finally陳述句一定會被執行嗎?
1.return陳述句執行順序
1.1finally陳述句是在return陳述句執行之后,return陳述句回傳之前執行的
package exception;
public class Demo06 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代碼塊");
return a += 10;
}catch (Exception e){
System.out.println("catch中的代碼塊");
}finally {
System.out.println("finally中的代碼塊");
if(a > 10){
System.out.println("a > 10,"+"a="+a);
}
}
return a += 50;
}
}
運行結果:
try中的代碼塊
finally中的代碼塊
a > 10,a=20
20
注意:
a > 10,a=20的結果說明了return a += 10已經執行了,但是沒有直接回傳,而是先去執行finally陳述句的內容,然后再去回傳結果
2.覆寫問題
2.1finally塊中的return陳述句會覆寫try塊的return回傳
package exception;
public class Demo07 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代碼塊");
return a += 10;
}catch (Exception e){
System.out.println("catch中的代碼塊");
}finally {
System.out.println("finally中的代碼塊");
if(a > 10){
System.out.println("a>10,"+"a="+a);
}
return 100;
}
}
}
運行結果:
try中的代碼塊
finally中的代碼塊
a>10,a=20
100
注意:
(1)如果try中有return陳述句,finally中也有return陳述句,最終執行的是finally中的return陳述句
(2)如果finally代碼塊中寫了return陳述句,那么finally之后的return陳述句就變成不可到達的陳述句,需要注釋掉,否則編譯不過
2.2如果finally陳述句沒有return陳述句覆寫回傳值,那么原來的回傳值可能因為finally里的修改而改變也有可能不變
(1)測驗1
package exception;
public class Demo08 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代碼塊");
return a += 20;
}catch (Exception e){
e.printStackTrace();
System.out.println("catch中的代碼塊");
}finally {
System.out.println("finally中的代碼塊");
a += 20;
if(a > 10){
System.out.println("a > 10,a="+a);
}
a += 20;
}
return 200;
}
}
運行結果:
try中的代碼塊
finally中的代碼塊
a > 10,a=50
30
注意:
對于基本資料型別來說,finally中對回傳值的修改不會影響try中的回傳變數的值
(2)測驗2
package exception;
import java.util.HashMap;
import java.util.Map;
public class Demo09 {
public static void main(String[] args) {
System.out.println(getMap().get("KEY").toString());
}
public static Map<String,String> getMap(){
Map<String,String> map = new HashMap<>();
map.put("KEY","INIT");
try{
map.put("KEY","try");
return map;
}catch (Exception e){
e.printStackTrace();
map.put("KEY","catch");
}finally {
map.put("KEY","finally");
map = null;
}
return map;
}
}
運行結果:
finally
注意:
對于參考資料型別來說,finally中對回傳值的修改會影響try中的回傳變數的值
3.例外情況
3.1try塊中的return陳述句在例外的情況下不會被執行
package exception;
public class Demo10 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代碼塊");
a = a/0;
return a += 50;
}catch (Exception e){
a += 15;
System.out.println("catch中的代碼塊");
}finally {
System.out.println("finally中的代碼塊");
if(a > 20){
System.out.println("a > 20,a ="+a);
}
a += 10;
}
return a;
}
}
運行結果:
try中的代碼塊
catch中的代碼塊
finally中的代碼塊
a > 20,a =25
35
注意:
try陳述句塊中發生例外,try陳述句例外后的內容不會執行,return陳述句也不會執行,執行的是捕獲到的catch陳述句塊和finally陳述句塊
3.2try中發生例外時,return寫在catch陳述句中
package exception;
public class Demo11 {
public static void main(String[] args) {
System.out.println(func());
}
public static int func(){
int a = 10;
try{
System.out.println("try中的代碼塊");
a = a /0;
return a += 10;
}catch (Exception e){
System.out.println("catch中的代碼塊");
return a += 15;
}finally {
System.out.println("finally中的代碼塊");
if (a > 10){
System.out.println("a > 10, a = "+a);
}
a += 50;
System.out.println(a);
}
}
}
運行結果:
try中的代碼塊
catch中的代碼塊
finally中的代碼塊
a > 10, a = 25
75
25
注意:
try中發生例外之后,catch中的return陳述句先執行,確定了回傳值之后(保存起來,finally中的陳述句對回傳值無影響)再去finally陳述句塊,執行完之后再回傳a的值,finally中對a的修改對回傳值無效
4.finally陳述句一定會被執行嗎?
(1)當程式進入try陳述句之前就出現例外時,會直接結束
(2)try陳述句塊中有強制退出時也不會執行finally陳述句塊中的代碼
System.exit(0);
代碼示例:
package exception;
public class Demo12 {
public static void main(String[] args) {
int a = 10;
try{
System.out.println("try block");
System.exit(0);
}catch (Exception e){
System.out.println("catch block");
}finally {
System.out.println("finally block");
}
}
}
運行結果:
try block
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280677.html
標籤:java
