首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2ME 入門血淚教訓:構造函數誤加 void 導致 NPE,類別初始化機制深度反思

     編輯:Java 相關知識

學習 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)
    ...

根因分析

  1. startApp() 是 MIDlet 生命週期入口,但物件建構仍由構造函數完成,J2ME 不會改變 Java 實例化機制。
  2. public void ImageItemDemo() 是回傳值為 void 的普通方法,不會在 new 物件時自動呼叫。
  3. mainform 宣告為成員變數但未在真正構造函數中初始化,預設為 null。
  4. startApp() 存取 mainform 觸發 NPE。

修正與教訓

// 正確:移除 void
public ImageItemDemo() {
    mainform = new Form("ImageItem Test");
    // ...
}

一個 void 關鍵字耗費整天除錯。深刻提醒:

  • 語法基礎必須過硬:構造函數無回傳類型,甚至不能寫 void。
  • 異常堆疊是最忠實的線索:startApp 拋 NPE → 檢查該方法用到的成員變數 → 追溯初始化路徑 → 發現構造函數未執行。
  • 學習不可淺嚐輒止,必須知其然更知其所以然。

將這段經歷記錄下來,既是自我警惕,也希望同路的初學者避開同樣陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved