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

Java 空指針異常:區域變數遮蔽導致 wb 為 null

     編輯:程式設計綜合問答

錯誤程式碼片段


String wb; // 成員變數

else if (e.getActionCommand().equals("查找")) {
    wb = wby.getText(); // 賦值給成員變數
    new Way(1); // 開啟對話框
}
else if (e.getActionCommand().equals("開始")) {
    System.out.print(wb); // 此處 wb 為 null!
    int s = wb.indexOf(...); // NPE
}

根本原因

**區域變數遮蔽**:在 `"查找"` 分支中,**重新宣告**了 `String wb = wby.getText();` (或類似),導致賦值給**區域變數**,而非成員變數。成員變數 `wb` 保持 `null`,後續 `"開始"` 分支讀取成員變數 → NPE。

修正


// 移除區域宣告,直接賦值給成員變數
else if (e.getActionCommand().equals("查找")) {
    this.wb = wby.getText(); // 明確 this.wb
    new Way(1);
}

完整可運行範例:文字搜尋工具


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class FindTextDemo extends JFrame {
    private JTextArea textArea;
    private JTextField findField;
    private String lastFindText = ""; // 成員變數保存搜尋關鍵字
    private int searchIndex = 0;

    public FindTextDemo() {
        setTitle("文字搜尋示例");
        setSize(400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JPanel top = new JPanel(new BorderLayout());
        top.add(new JLabel("搜尋:"), BorderLayout.WEST);
        findField = new JTextField(15);
        top.add(findField, BorderLayout.CENTER);
        JButton btnFind = new JButton("查找");
        JButton btnNext = new JButton("下一個");
        top.add(btnFind, BorderLayout.EAST);
        add(top, BorderLayout.NORTH);

        textArea = new JTextArea();
        textArea.setText("白日依山盡,\n黃河入海流;\n欲窮千里目,\n更上一層樓");
        add(new JScrollPane(textArea), BorderLayout.CENTER);

        btnFind.addActionListener(e -> {
            lastFindText = findField.getText(); // 賦值給成員變數
            searchIndex = 0;
            findNext();
        });
        btnNext.addActionListener(e -> findNext());
    }

    private void findNext() {
        if (lastFindText.isEmpty()) return;
        String content = textArea.getText();
        int pos = content.indexOf(lastFindText, searchIndex);
        if (pos >= 0) {
            textArea.setCaretPosition(pos);
            textArea.moveCaretPosition(pos + lastFindText.length());
            searchIndex = pos + 1;
        } else {
            JOptionPane.showMessageDialog(this, "搜尋完畢");
            searchIndex = 0;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new FindTextDemo().setVisible(true));
    }
}

核心教訓

  • **不要在方法內重新宣告同名變數** (Shadowing),除非刻意需要區域暫存。
  • 使用 `this.field` 明確指向成員變數。
  • IDE 開啟「Shadowing variable」警告 (Eclipse/IntelliJ 預設開啟),**務必修復警告**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved