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

Android findViewById 空指針崩潰經典案例:控件初始化順序錯誤(在 setContentView 前調用)

     編輯:程式設計綜合問答

現象:Activity 啟動即崩潰,Logcat 指向 findViewById 行拋出 NullPointerException。

錯誤代碼

public class ConverterActivity extends Activity {
    // 錯誤:在成員變量初始化時調用 findViewById
    EditText convertValue = (EditText) findViewById(R.id.et_value_convert);
    TextView convertResult = (TextView) findViewById(R.id.txt_result);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_converter); // 佈局在此後加載
        // ...
    }
}

根因:視圖層級尚未建立

  • 成員變量初始化發生在 onCreate() **之前**(構造函數階段)。
  • 此時 setContentView() 尚未調用,**視圖樹不存在**,findViewById() 返回 null。
  • 後續對 null 調用方法(如 setText())觸發 NPE。

修正代碼

public class ConverterActivity extends Activity {
    // 1. 只聲明,不初始化
    private EditText convertValue;
    private TextView convertResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 2. 先加載佈局
        setContentView(R.layout.activity_converter);
        // 3. 再查找控件
        convertValue = findViewById(R.id.et_value_convert);
        convertResult = findViewById(R.id.txt_result);
        // ...
    }
}

進階:ViewBinding 消除樣板代碼(推薦)

build.gradle

android {
    buildFeatures { viewBinding = true }
}

Activity 中

private ActivityConverterBinding binding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityConverterBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    
    // 直接使用 binding.etValueConvert, binding.txtResult
    binding.btnToCel.setOnClickListener(v -> {
        String input = binding.etValueConvert.getText().toString();
        // ...
    });
}

核心鐵律

findViewById / ViewBinding.inflate 必須在 setContentView 之後調用。

牢記初始化順序,或全面遷移 ViewBinding,徹底杜絕此類崩潰。

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