這不只是 J2ME 經驗,更是類 C++ 語言基礎的血淚教訓。一個 void 關鍵字,讓構造函數變成普通方法,導致成員變量未初始化,程序拋出 NullPointerException,我足足除錯了一整天。記錄下來,警醒自己與同路人。
public class ImageItemDemo extends MIDlet {
private Form mainForm;
private ImageItem img1, img2;
// 錯誤:加了 void,這不是構造函數!
public void ImageItemDemo() {
mainForm = new Form("Demo");
try {
img1 = new ImageItem(...);
img2 = new ImageItem(...);
} catch (Exception e) { ... }
mainForm.append(img1);
mainForm.append(img2);
}
protected void startApp() {
Display.getDisplay(this).setCurrent(mainForm); // NPE!mainForm 為 null
}
// ...
}
startApp threw an Exception java.lang.NullPointerException
at ImageItemDemo.startApp(+64)
...
startApp 拋出 NPE,涉及對象:mainForm、img1、img2。img1/2。mainForm 已在類中聲明,並在「構造函數」中實例化,為何仍為 null?構造函數不能有返回類型,甚至不能有 void。
public void ImageItemDemo() 是一個普通方法,名稱恰好與類同名。mainForm 自然保持默認值 null。// 移除 void,變回真正的構造函數
public ImageItemDemo() {
mainForm = new Form("Demo");
// ...
}
startApp 是入口點,但對象構造早於 startApp 完成。