學習 J2ME 時犯下的經典低級錯誤:在 MIDlet 子類別中寫了 public void ImageItemDemo() 而非 public ImageItemDemo()。多出的 void 讓它變成普通方法而非構造函數,導致 mainform 等成員變數未初始化,startApp() 執行時拋出 NullPointerException。
public class ImageItemDemo extends MIDlet implements CommandListener {
private Form mainform;
// 錯誤:多了 void,這不是構造函數!
public void ImageItemDemo() {
mainform = new Form("ImageItem Test");
// ...
}
public void startApp() {
// 此時 mainform 仍為 null
mainform.append(img1); // NPE!
}
}
startApp threw an Exception
java.lang.NullPointerException
at ImageItemDemo.startApp(+64)
...
startApp() 是 MIDlet 生命週期入口,但物件建構仍由構造函數完成,J2ME 不會改變 Java 實例化機制。public void ImageItemDemo() 是回傳值為 void 的普通方法,不會在 new 物件時自動呼叫。mainform 宣告為成員變數但未在真正構造函數中初始化,預設為 null。startApp() 存取 mainform 觸發 NPE。// 正確:移除 void
public ImageItemDemo() {
mainform = new Form("ImageItem Test");
// ...
}
一個 void 關鍵字耗費整天除錯。深刻提醒:
void。startApp 拋 NPE → 檢查該方法用到的成員變數 → 追溯初始化路徑 → 發現構造函數未執行。將這段經歷記錄下來,既是自我警惕,也希望同路的初學者避開同樣陷阱。