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

深度解析 Java 事件處理與異常處理機制

     編輯:Java 相關知識

一、Java 事件處理機制

1. 事件處理模型演進

  • JDK 1.0:基於繼承的鏈式模型。事件從組件向上傳遞至容器,未被處理則繼續冒泡。已淘汰。
  • JDK 1.1+:委派事件模型(現行標準)。事件源直接通知註冊的監聽器,不再自動傳遞。核心三要素:
    • 事件源:產生事件的組件(按鈕、滑鼠、鍵盤、視窗等)。
    • 事件對象:封裝事件信息(java.awt.event.*),繼承 AWTEvent,提供 getSource() 獲取來源。
    • 事件監聽器:實現特定 EventListener 介面的類,含處理方法(如 actionPerformed)。

2. 事件處理步驟

  1. 導入 java.awt.event.*。
  2. 向事件源註冊監聽器:source.addXxxListener(listener)。
  3. 實現監聽器介面所有方法(或繼承適配器類僅覆寫所需方法)。

3. 常見事件類別與監聽器

事件類別事件類監聽器介面/適配器核心處理方法
動作事件ActionEventActionListeneractionPerformed(ActionEvent e)
滑鼠事件MouseEventMouseListener / MouseAdaptermouseClicked, mousePressed, mouseReleased, mouseEntered, mouseExited
滑鼠移動MouseEventMouseMotionListener / MouseMotionAdaptermouseMoved, mouseDragged
鍵盤事件KeyEventKeyListener / KeyAdapterkeyPressed, keyReleased, keyTyped
視窗事件WindowEventWindowListener / WindowAdapterwindowOpened, windowClosing, windowClosed, windowActivated, windowDeactivated, windowIconified, windowDeiconified
項目事件ItemEventItemListeneritemStateChanged(ItemEvent e)
調整事件AdjustmentEventAdjustmentListeneradjustmentValueChanged(AdjustmentEvent e)

4. 適配器模式簡化編碼

監聽器介面方法較多時,繼承對應 XxxAdapter 類,僅覆寫關心的方法,避免實現空方法。例如:

frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});

5. 事件處理完整範例

import java.awt.*;
import java.awt.event.*;

public class EventDemo extends Frame implements ActionListener {
    Button btn = new Button("點擊我");
    TextField tf = new TextField(20);

    public EventDemo() {
        setLayout(new FlowLayout());
        add(btn);
        add(tf);
        btn.addActionListener(this);
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) { System.exit(0); }
        });
        setSize(300, 200);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        tf.setText("按鈕被點擊:" + new Date());
    }

    public static void main(String[] args) {
        new EventDemo();
    }
}

二、Java 異常處理機制

1. 異常體系結構

  • Throwable:頂層父類。
    • Error:JVM 級嚴重錯誤(如 OutOfMemoryError),應用無需捕獲。
    • Exception:應用級異常,分為:
      • 受檢異常(Checked Exception):編譯器強制捕獲或拋出(如 IOException、SQLException)。
      • 非受檢異常(Runtime Exception):編譯器不強制,邏輯錯誤導致(如 NullPointerException、ArrayIndexOutOfBoundsException)。

2. 異常關鍵字與流程

  • throw:在方法內顯式拋出異常對象。
  • throws:在方法簽名聲明可能拋出的受檢異常,提醒調用者處理。
  • try-catch-finally:捕獲並處理異常。
    • try 包裹可能拋異常代碼。
    • catch 按類型匹配處理,多 catch 由具體到通用排序。
    • finally 無論是否異常皆執行,用於資源釋放(關閉流、鎖、連接)。

3. 自定義異常最佳實踐

public class BusinessException extends RuntimeException {
    private final int errorCode;
    public BusinessException(int code, String message) {
        super(message);
        this.errorCode = code;
    }
    public int getErrorCode() { return errorCode; }
}
  • 業務異常繼承 RuntimeException,減少樣板代碼,由全局異常處理器統一捕獲轉換為錯誤響應。
  • 系統/受檢異常(如 IO、SQL)保持受檢,強制調用者感知處理。

4. 異常處理原則

  1. 具體優先:catch 子句按異常具體程度排序,父類異常放最後。
  2. 不吞沒異常:catch 至少記錄日誌(log.error),避免空 catch 導致故障隱形。
  3. 資源關閉用 try-with-resources (JDK 7+):
    try (InputStream in = Files.newInputStream(path)) {
        // 讀取
    } // 自動關閉
  4. 異常轉換保留堆棧:拋出新異常時帶上原異常 throw new BusinessException(500, "處理失敗", e)。
  5. 避免用異常控制業務流程:異常開銷大,普通分支用條件判斷。

5. 綜合示例:用戶薪資驗證

public class Employee {
    private String name;
    private double salary;

    public Employee(String name, double salary) throws IllegalSalaryException {
        if (salary < 800) throw new IllegalSalaryException("薪資低於最低標準");
        this.name = name;
        this.salary = salary;
    }

    public void raiseSalary(double newSalary) throws IllegalSalaryException, IllegalRaiseException {
        if (newSalary < 800) throw new IllegalSalaryException("薪資低於最低標準");
        if (salary > 0 && Math.abs(newSalary - salary) / salary >= 0.2)
            throw new IllegalRaiseException("漲幅超過 20%");
        this.salary = newSalary;
    }
}

// 自定義受檢異常
class IllegalSalaryException extends Exception {
    public IllegalSalaryException(String msg) { super(msg); }
}
class IllegalRaiseException extends Exception {
    public IllegalRaiseException(String msg) { super(msg); }
}

// 使用
try {
    Employee emp = new Employee("張三", 5000);
    emp.raiseSalary(7000);
} catch (IllegalSalaryException | IllegalRaiseException e) {
    log.warn("薪資異常:{}", e.getMessage());
    // 友好提示用戶
}

總結

事件處理採用委派模型,通過監聽器解耦事件源與處理邏輯;異常處理提供結構化錯誤傳遞機制,合理使用受檢/非受檢異常、自定義異常、try-with-resources,能顯著提升代碼健壯性與可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved