java.lang.RuntimeException: Unable to instantiate activity ...
Caused by: java.lang.NullPointerException
at ... NumberActivity. (findViewById 呼叫處)
成員變數初始化階段(NumberActivity 建構子隱含執行)呼叫 findViewById,但此時 **View 階層尚未建立**(setContentView 尚未執行),返回 null,後續 solve.setOnClickListener 導致 NPE。
public class NumberActivity extends Activity {
EditText pressure, temperature, volume;
TextView answer;
Button solve;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_number); // 先建立 View 階層
// 再綁定 View
pressure = findViewById(R.id.editTextPressure);
temperature = findViewById(R.id.editTextTemperature);
volume = findViewById(R.id.editTextVolume);
answer = findViewById(R.id.textViewSolve);
solve = findViewById(R.id.buttonSolve);
solve.setOnClickListener(v -> {
// 解析與計算邏輯...
});
}
}
// build.gradle
viewBinding { enabled = true }
// Activity
private ActivityNumberBinding binding;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityNumberBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.buttonSolve.setOnClickListener(v -> {
double p = Double.parseDouble(binding.editTextPressure.getText().toString());
// ...
});
}
編譯期生成綁定類,類型安全、無 NPE、程式碼更簡潔。