public class MainActivity extends Activity {
private TextView tx1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tx1 = (TextView) findViewById(R.id.txtexample); // 這裡返回 null
try {
tx1.setText("Hello testing"); // NPE
} catch (Exception e) { ... }
}
}
<TextView
android:name="@+id/txtexample" <-- 錯誤屬性
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
android:name 不是標準屬性,系統不識別,導致 findViewById(R.id.txtexample) 找不到 View,返回 null。
<TextView
android:id="@+id/txtexample" <-- 正確屬性
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
| 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|
| android:name="@+id/xxx" | android:id="@+id/xxx" | id 定義 |
| android:id="@id/xxx" | android:id="@+id/xxx" | + 表示新建 ID |
| findViewById(R.id.xxx) 在 setContentView 前 | 在 setContentView 後 | View 未加載 |
| Fragment 中用 getActivity().findViewById | view.findViewById | 作用域錯誤 |
| 佈局文件名與 setContentView 不符 | 檢查 R.layout.xxx | 資源引用錯誤 |
buildFeatures { viewBinding true },編譯期檢查,消除 findViewByIdTextView tx1 = findViewById(R.id.txtexample); if (tx1 == null) throw new IllegalStateException("View not found");90% 的 findViewById 返回 null 都是 XML 屬性寫錯或調用時機錯。改用 ViewBinding 可從根源杜絕此類低級錯誤,提升開發效率。