所有 MIDlet 必須繼承 javax.microedition.midlet.MIDlet 並實作:
protected void startApp() // 應用啟動/恢復前景:初始化 UI、啟動執行緒、恢復狀態
protected void pauseApp() // 進入背景/來電中斷:釋放資源、暫停執行緒、存檔
protected void destroyApp(boolean unconditional) // 銷毀/退出:釋放所有資源、關閉連線、持久化

狀態轉換:Paused → Active (startApp) → Paused (pauseApp) → Destroyed (destroyApp)。unconditional=true 表示必須銷毀(無視阻塞),false 允許拋出 MIDletStateChangeException 拒絕銷毀。
package com.mot.j2me.midlets.tutorials; // 需與目錄結構一致
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet {
private Display display;
private Form form;
public HelloMIDlet() {
display = Display.getDisplay(this);
form = new Form("Hello MIDlet");
form.append(new StringItem("Hello", "MIDlet"));
}
protected void startApp() {
display.setCurrent(form);
}
protected void pauseApp() {}
protected void destroyApp(boolean unconditional) {}
}
儲存路徑:<SDK>\demo\midlets\com\mot\j2me\midlets\tutorials\HelloMIDlet.java
在 demo\midlets 目錄執行:
compileAll HelloMIDlet.java
輸出示意:

javac -O -bootclasspath ..\lib HelloMIDlet.java
-bootclasspath ..\lib:指定 CLDC/MIDP 核心類庫 (rt.jar 替代品)-O:啟用優化 (內聯、常數折疊)preverify -classpath ..\lib;. -d . HelloMIDlet
-classpath ..\lib;.:核心庫 + 當前目錄編譯輸出-d .:輸出覆蓋原 class 檔 (注入 StackMap 屬性)-d,預設輸出至 ./output 子目錄REM 假設 SDK 在 D:\MotoSDK,原始碼在 d:\myproj\com\example\MyMidlet.java
cd d:\myproj
REM 1. 編譯
javac -O -bootclasspath D:\MotoSDK\lib com\example\MyMidlet.java
REM 2. 預驗證
preverify -classpath D:\MotoSDK\lib;. -d . com\example\MyMidlet
技巧:將 compileAll.bat 複製到專案根目錄,修改 COMPILECLASS 環境變數指向專案 package,即可一鍵建構。
runEmul com.mot.j2me.midlets.tutorials.HelloMIDlet
模擬器啟動 → 選擇「啟動」 → 顯示 "Hello MIDlet" 表單 → 成功!
HelloMIDlet.jar, HelloMIDlet.jadMIDlet-Name, MIDlet-Version, MIDlet-Vendor, MIDlet-Jar-URL, MIDlet-Jar-Size, MIDlet-1: HelloMIDlet, , com.mot.j2me.midlets.tutorials.HelloMIDlet.jad → text/vnd.sun.j2me.app-descriptor, .jar → application/java-archive| 錯誤 | 原因 | 修正 |
|---|---|---|
| 構造函數拋出例外 | 構造子中呼叫 Display.getDisplay(this) 但 MIDlet 尚未完全初始化 | 移至 startApp() 或延遲初始化 |
| 模擬器顯示空白 | 未呼叫 display.setCurrent() 或 Form 無元件 | 確保 startApp 設定當前顯示物件 |
| 預驗證失敗 "Incompatible class file version" | JDK 版本過新產生 50.0+ class | javac -target 1.1 -source 1.3 強制相容 |
| 真機安裝 "Invalid JAD" | JAD 中 Jar Size 與實際不符 | 重新 Package 或手動修正大小 |