public class MainActivity extends Activity implements OnClickListener {
EditText centimeters = (EditText) findViewById(R.id.editCentimeters); // 錯誤:此時 View 尚未建立
EditText inches = (EditText) findViewById(R.id.editInches);
Button btnConverter = (Button) findViewById(R.id.button);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 佈局在此行才充氣
btnConverter.setOnClickListener(this); // btnConverter 仍為 null
}
...
}
成員變數初始化階段執行 findViewById,但 setContentView 尚未執行,導致所有 View 為 null,點擊時拋出 NullPointerException。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// 1. 僅宣告,不初始化
private EditText centimeters;
private EditText inches;
private Button btnConverter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 2. 先充氣佈局
setContentView(R.layout.activity_main);
// 3. 再 findViewById
centimeters = findViewById(R.id.editCentimeters);
inches = findViewById(R.id.editInches);
btnConverter = findViewById(R.id.button);
// 4. 設定監聽器
btnConverter.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.button) {
String cmStr = centimeters.getText().toString().trim();
if (cmStr.isEmpty()) return;
double cm = Double.parseDouble(cmStr);
double inch = cm * 0.393701;
inches.setText(String.format(Locale.getDefault(), "%.2f", inch));
}
}
}
onCreate → setContentView → findViewById → 設定監聽器/資料。AppCompatActivity:支援 Material 元件、向下相容。getText().toString().trim() 檢查空字串,避免 NumberFormatException。String.format(Locale.getDefault(), "%.2f", value) 固定小數位,避免科學記號。開啟 buildFeatures { viewBinding = true } 後,自動生成綁定類別,完全消除 findViewById 與空指針風險:
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.button.setOnClickListener(v -> {
String cmStr = binding.editCentimeters.getText().toString().trim();
if (!cmStr.isEmpty()) {
double cm = Double.parseDouble(cmStr);
binding.editInches.setText(String.format(Locale.getDefault(), "%.2f", cm * 0.393701));
}
});
}
View Binding 是目前 Google 官方推薦標準,新專案請優先採用。