首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 內部類與異常處理機制深度解析:從語法到最佳實踐

     編輯:Java 綜合教學

Java 內部類與異常處理機制深度解析

本文深入剖析 Java 內部類四大類型(成員、靜態、局部、匿名)的語法、訪問規則、編譯產物與應用場景,並系統講解異常體系架構、處理流程、自定義異常設計、常見異常類別與最佳實踐原則。

一、內部類完整分類

1.1 成員內部類

  • 定義在類內部、方法外部,與成員變數/方法平級。
  • 可直接訪問外部類所有成員(含 private)。
  • 外部類訪問內部類需建立實例:Outer.Inner in = new Outer().new Inner();
  • 不能定義 static 成員(final 常量除外),因實例未建立前 static 已載入。

1.2 靜態內部類

  • 用 static 修飾,不依賴外部類實例。
  • 只能直接訪問外部類 static 成員;需訪問實例成員須 new Outer().field。
  • 可定義 static 成員;可直接實例化:Outer.StaticInner si = new Outer.StaticInner();
  • 不可用 private 修飾(編譯錯誤)。

1.3 局部內部類

  • 定義在方法/代碼塊內,作用域限於該塊。
  • 不可加訪問修飾符;可訪問外部類成員與 final/effectively final 區域變數(JDK8+ 隱含 final)。
  • 編譯產物:Outer$1Inner.class、Outer$2Inner.class 等。

1.4 匿名內部類

  • 無類名,隱含繼承一個類或實作一個介面,定義與實例化同時進行。
  • 語法:new SuperType() { ... } 或 new Interface() { ... }。
  • 無建構子(無類名),可用實例初始化塊 `{}` 替代。
  • 常用場景:事件監聽器、執行緒任務、比較器、啟動時一次性邏輯。
  • 限制:不能是抽象類;必須實作所有抽象方法;建議方法數 ≤ 3,否則改用具名類。

1.5 編譯產物命名規則

Outer.class
Outer$Inner.class           // 成員內部類
Outer$StaticInner.class     // 靜態內部類
Outer$1Local.class          // 局部內部類(方法 1)
Outer$2Local.class          // 局部內部類(方法 2)
Outer$1.class               // 匿名內部類(第 1 個)

1.6 綜合代碼範例

public class InnerDemo {
    private int outerField = 10;
    static int staticField = 20;

    // 成員內部類
    class MemberInner { void show() { System.out.println(outerField); } }

    // 靜態內部類
    static class StaticInner { 
        static void staticMethod() { System.out.println(staticField); }
        void instanceMethod() { System.out.println(new InnerDemo().outerField); }
    }

    // 局部內部類
    void methodLocal() {
        final int localFinal = 5;
        class LocalInner { void show() { System.out.println(localFinal); } }
        new LocalInner().show();
    }

    // 匿名內部類
    Runnable task = new Runnable() {
        @Override public void run() { System.out.println("Anonymous run"); }
    };
}

二、異常處理機制全景

2.1 異常體系繼承樹

Throwable
├── Error          // 嚴重錯誤,程式無法處理(OOM、StackOverflow)
└── Exception      // 可處理異常
    ├── RuntimeException      // 非受檢異常(空指針、越界、算術、類轉型)
    │   ├── NullPointerException
    │   ├── ArrayIndexOutOfBoundsException
    │   ├── ArithmeticException
    │   └── ClassCastException
    └── Checked Exceptions    // 受檢異常,編譯強制處理
        ├── IOException
        ├── SQLException
        ├── ClassNotFoundException
        └── ParseException

2.2 捕獲與處理三種語法

// 1. try-catch-finally
try { risky(); }
catch (IOException e) { handleIO(e); }
catch (SQLException e) { handleSQL(e); }
finally { cleanup(); }  // 必執行,return/throw 前執行

// 2. try-finally(無 catch,異常向上拋)
try { risky(); } finally { cleanup(); }

// 3. try-catch(無 finally)
try { risky(); } catch (Exception e) { handle(e); }

finally 不執行四種情況:finally 內拋異常、線程死亡、System.exit()、CPU 關機。

2.3 多 catch 捕獲順序

子類異常在前,父類在後,否則編譯錯誤(不可達代碼)。

2.4 throws 拋出聲明

public void readFile(String path) throws IOException, ParseException {
    // 方法內拋出或調用拋出受檢異常的方法
}
  • 受檢異常必須 catch 或 throws;RuntimeException 可不聲明。
  • 覆寫方法拋出異常必須是父類聲明異常的子類或子集。

2.5 throw 手動拋出

if (age < 0) throw new IllegalArgumentException("年齡不可為負");
throw e; // 重新拋出捕獲的異常(保留堆疊追蹤)

三、自定義異常設計規範

// 業務異常:繼承 RuntimeException,不可恢復,需修正代碼
public class BizException extends RuntimeException {
    private final int code;
    public BizException(int code, String msg) { super(msg); this.code = code; }
    public int getCode() { return code; }
}

// 受檢異常:繼承 Exception,呼叫者可嘗試恢復
public class CheckedBizException extends Exception {
    public CheckedBizException(String msg) { super(msg); }
    public CheckedBizException(String msg, Throwable cause) { super(msg, cause); }
}

設計原則:異常類名以 Exception 結尾;提供無參、訊息、原因、代碼等多重建構子;保留堆疊追蹤(fillInStackTrace() 可覆寫控制)。

四、常見異常速查表

異常類別典型場景
NullPointerExceptionRuntime未實例化調用方法/欄位
ArrayIndexOutOfBoundsExceptionRuntime陣列索引 < 0 或 >= length
NumberFormatExceptionRuntime字串轉數字格式錯誤
ClassNotFoundExceptionChecked反射載入類失敗
IOExceptionChecked檔案/網路 I/O 錯誤
SQLExceptionChecked資料庫操作失敗

五、異常處理最佳實踐原則

  1. 具體捕獲:捕獲具體異常類,避免 catch (Exception e) 吞沒錯誤。
  2. 異常轉換:底層異常包裝為業務異常拋出,保留 cause 鏈。
  3. 資源關閉:try-with-resources (JDK7+) 自動關閉 AutoCloseable 資源。
  4. 不作控制流:異常僅用於錯誤處理,不用於正常業務判斷。
  5. 日誌記錄:log.error("msg", e) 完整堆疊,避免 e.printStackTrace()。
  6. 文檔聲明:Javadoc @throws 說明拋出條件與含義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved