動手動腦5
https://files.cnblogs.com/files/blogs/847696/動手動腦5.zip?t=1762256201&download=true

程序在第5行有一個問題:
int i=1, j=0, k;
k=i/j; // 這里會在 try-catch 塊之前就拋出異常,導致程序終止
正確的異常處理流程
try 塊:包含可能拋出異常的代碼 k = i/j
catch 塊:捕獲特定類型的異常
第一個 catch 捕獲 ArithmeticException(算術異常)
第二個 catch 捕獲更通用的 Exception
finally 塊:無論是否發生異常都會執行
異常處理基礎知識總結
- 異常類型
檢查異常:必須處理(如 IOException)
非檢查異常:RuntimeException 及其子類(如 ArithmeticException) - 異常處理機制
try {
// 可能拋出異常的代碼
} catch (SpecificException e) {
// 處理特定異常
} catch (Exception e) {
// 處理其他異常
} finally {
// 無論是否異常都會執行(常用于資源清理)
} - 關鍵特點
異常傳播:異常會沿著調用棧向上傳播
多重 catch:從具體到一般的順序排列
finally 保證:即使有 return 或異常,finally 也會執行


程序執行流程:
程序進入外層 try 塊。
在內層 try 塊中,拋出 ArrayIndexOutOfBoundsException 異常。
該異常被內層 catch 塊捕獲,輸出:ArrayIndexOutOfBoundsException/內層try-catch。
內層 catch 塊執行完畢后,程序繼續執行外層 try 塊的剩余代碼,拋出 ArithmeticException 異常。
該異常被外層第一個 catch 塊(捕獲 ArithmeticException)捕獲,輸出:發生ArithmeticException。
外層第二個 catch 塊(捕獲 ArrayIndexOutOfBoundsException)不會執行,因為異常已被內層處理且外層拋出的是 ArithmeticException。
運行結果:
text
ArrayIndexOutOfBoundsException/內層try-catch
發生ArithmeticException
說明:
代碼中的字符串輸出有拼寫不一致(如 "ArrayList>OutOfBoundsException"),但根據實際代碼邏輯,輸出以代碼中的字符串為準。
這是一個多層異常捕獲的示例,展示了內層 catch 塊處理特定異常后,外層繼續處理其他異常的過程。


ArrayIndexOutOfBoundsException/外層try-catch

以下是代碼的逐步執行過程:
進入Level 1:執行System.out.println("in Level 1")。
進入Level 2:執行System.out.println("in Level 2")。
進入Level 3:執行System.out.println("in Level 3")。
Level 3拋出異常:執行result=100/0,拋出ArithmeticException。
Level 3捕獲異常:異常被Level 3的catch塊捕獲,輸出Level 3: class java.lang.ArithmeticException。
執行Level 3的finally:無論是否發生異常,finally塊都會執行,輸出In Level 3 finally。
Level 2繼續執行:由于Level 3的異常被內部捕獲,Level 2的try塊正常結束,不會觸發Level 2的catch塊。
執行Level 2的finally:輸出In Level 2 finally。
Level 1繼續執行:Level 1的try塊正常結束,不會觸發Level 1的catch塊。
執行Level 1的finally:輸出In Level 1 finally。
預期輸出
根據以上分析,運行代碼后的輸出結果為:
in Level 1
in Level 2
in Level 3
Level 3: class java.lang.ArithmeticException
In Level 3 finally
In Level 2 finally
In Level 1 finally
關鍵總結
finally的執行時機:finally塊總是在對應的try塊退出時執行,無論是否發生異常。在嵌套結構中,finally塊從內向外依次執行。
異常處理的影響:如果異常在內部被捕獲(如Level 3),則外部try塊不會感知異常,后續代碼正常執行。如果異常未被內部捕獲,它會向外傳播,觸發外部catch塊。
不同異常拋出位置的對比(如圖片中強調的):
如果異常在Level 2拋出(取消注釋// result=100/0; //Level 2),則Level 3的try塊不會執行,輸出順序變為:Level 1 → Level 2 → Level 2異常捕獲 → Level 2 finally → Level 1 finally。
如果異常在Level 1拋出(取消注釋// result = 100 / 0; //level 1),則Level 2和Level 3都不會執行,輸出順序變為:Level 1 → Level 1異常捕獲 → Level 1 finally。
浙公網安備 33010602011771號