# ๅผ‚ๅธธ

                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                     โ”‚  Object   โ”‚
                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ฒ
                           โ”‚
                     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                     โ”‚ Throwable โ”‚
                     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ–ฒ
                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                 โ”‚                   โ”‚
           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
           โ”‚   Error   โ”‚       โ”‚ Exception โ”‚
           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                 โ–ฒ                   โ–ฒ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”Œโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚                      โ”‚               โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚OutOfMemoryError โ”‚... โ”‚RuntimeException โ”‚โ”‚IOExceptionโ”‚...
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                                โ–ฒ
                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                    โ”‚                         โ”‚
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚NullPointerException โ”‚ โ”‚IllegalArgumentException โ”‚...
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
public class Main {
    public static void main(String[] args) {
        try {
            Integer.parseInt("abc");
        } catch (Exception e) {
            System.out.println("catched");
            throw new RuntimeException(e);
        } finally {
            System.out.println("finally");
        }
    }
}

ไธŠ่ฟฐไปฃ็ ๆ‰ง่กŒ็ป“ๆžœๅฆ‚ไธ‹๏ผš

catched
finally
Exception in thread "main" java.lang.RuntimeException: java.lang.NumberFormatException: For input string: "abc"
    at Main.main(Main.java:8)
Caused by: java.lang.NumberFormatException: For input string: "abc"
    at ...

็ฌฌไธ€่กŒๆ‰“ๅฐไบ†catched๏ผŒ่ฏดๆ˜Ž่ฟ›ๅ…ฅไบ†catch่ฏญๅฅๅ—ใ€‚็ฌฌไบŒ่กŒๆ‰“ๅฐไบ†finally๏ผŒ่ฏดๆ˜Žๆ‰ง่กŒไบ†finally่ฏญๅฅๅ—ใ€‚

ๅ› ๆญค๏ผŒๅœจcatchไธญๆŠ›ๅ‡บๅผ‚ๅธธ๏ผŒไธไผšๅฝฑๅ“finally็š„ๆ‰ง่กŒใ€‚JVMไผšๅ…ˆๆ‰ง่กŒfinally๏ผŒ็„ถๅŽๆŠ›ๅ‡บๅผ‚ๅธธใ€‚

# ๅผ‚ๅธธๅฑ่”ฝ

ๅฆ‚ๆžœๅœจๆ‰ง่กŒfinally่ฏญๅฅๆ—ถๆŠ›ๅ‡บๅผ‚ๅธธ๏ผŒ้‚ฃไนˆ๏ผŒcatch่ฏญๅฅ็š„ๅผ‚ๅธธ่ฟ˜่ƒฝๅฆ็ปง็ปญๆŠ›ๅ‡บ๏ผŸไพ‹ๅฆ‚๏ผš

public class Main {
    public static void main(String[] args) {
        try {
            Integer.parseInt("abc");
        } catch (Exception e) {
            System.out.println("catched");
            throw new RuntimeException(e);
        } finally {
            System.out.println("finally");
            throw new IllegalArgumentException();
        }
    }
}

ๆ‰ง่กŒไธŠ่ฟฐไปฃ็ ๏ผŒๅ‘็Žฐๅผ‚ๅธธไฟกๆฏๅฆ‚ไธ‹๏ผš

catched
finally
Exception in thread "main" java.lang.IllegalArgumentException
    at Main.main(Main.java:11)

่ฟ™่ฏดๆ˜ŽfinallyๆŠ›ๅ‡บๅผ‚ๅธธๅŽ๏ผŒๅŽŸๆฅๅœจcatchไธญๅ‡†ๅค‡ๆŠ›ๅ‡บ็š„ๅผ‚ๅธธๅฐฑโ€œๆถˆๅคฑโ€ไบ†๏ผŒๅ› ไธบๅช่ƒฝๆŠ›ๅ‡บไธ€ไธชๅผ‚ๅธธใ€‚ๆฒกๆœ‰่ขซๆŠ›ๅ‡บ็š„ๅผ‚ๅธธ็งฐไธบโ€œ่ขซๅฑ่”ฝโ€็š„ๅผ‚ๅธธ๏ผˆSuppressed Exception๏ผ‰ใ€‚