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

Android CheckBox 聯動 Button 崩潰:TextView 未初始化導致空指針

     編輯:程式設計疑難解答

崩潰現象

點擊「我同意」CheckBox 啟用按鈕,再點擊按鈕時應用崩潰,Logcat 提示:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.ample.receive.MainActivity.onClick(MainActivity.java:45)

原因定位

代碼中聲明了 myTextView1、myTextView2 但未在 onCreate 中調用 findViewById 綁定布局控件,導致它們為 null,調用 setText 時拋出 NPE。

錯誤代碼片段

private TextView myTextView1;
private TextView myTextView2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...
    myCheckBox = findViewById(R.id.myCheckBox);
    myButton = findViewById(R.id.myButton);
    // 缺失:myTextView1 = findViewById(R.id.myTextView1);
    // 缺失:myTextView2 = findViewById(R.id.myTextView2);
}

修正代碼

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    myCheckBox = findViewById(R.id.myCheckBox);
    myButton = findViewById(R.id.myButton);
    myTextView1 = findViewById(R.id.myTextView1); // 新增
    myTextView2 = findViewById(R.id.myTextView2); // 新增
    
    myCheckBox.setOnClickListener(this);
    myButton.setOnClickListener(this);
}

最佳實踐建議

  1. 使用 ViewBinding(推薦):在 build.gradle 啟用 viewBinding true,自動生成綁定類,消除 findViewById 與 NPE。
    // Activity 中
    private ActivityMainBinding binding;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        binding.myCheckBox.setOnClickListener(...);
        binding.myTextView1.setText(...); // 直接訪問,編譯期檢查非空
    }
    
  2. 啟用 Kotlin + 合成屬性(舊項目):apply plugin: 'kotlin-android-extensions' 可直接用 ID 訪問 View。
  3. 統一初始化方法:將所有 findViewById 集中在 initViews() 中,便於檢查遺漏。

調試技巧

  • 閱讀堆棧定位行號(示例第 45 行),直接查看該行調用了哪個 View 的方法。
  • 使用 Android Studio 的 Layout Inspector 確認布局 XML 中的 ID 拼寫與 Java 代碼一致。
  • 設置斷點在 onCreate 結束處,觀察 View 變量是否為 null。

總結

Android 開發中 90% 的 NPE 來自未初始化的 View。養成「聲明即綁定」習慣,或遷移至 ViewBinding,可徹底杜絕此類低級崩潰。

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