初學J2ME的一點經驗
初學J2ME的一點經驗[@more@] 與其說是學J2ME的經驗,倒不如說是類C++語言的一點注意事項,之所以這麼說,是因為這個問題是在學J2ME時候發現的,整整折騰了我一天,雖然只是一點小的失誤,但是直接後果是程式不斷異常,所以我把它寫出來,一方面提醒自己,學知識不能淺嘗輒止,而應該多問為什麼,不僅知其然還要知所以然,另一方面也告訴更多像我這樣初學的朋友不要犯相同的錯誤。
下面請看一段程式碼:
/*
* ImageItemDemo.java
*
* Created on 2005年7月24日, 下午1:45
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
*
* @author mark
* @version
*/
public class ImageItemDemo extends MIDlet implements CommandListener{
private Command exitCommand=new Command("Exit",Command.EXIT,1);
private Form mainform;;
private ImageItem img1,img2;
public void ImageItemDemo(){
mainform=new Form("ImageItem Test");
mainform.append("顯示各種ImageItem");
mainform.addCommand(exitCommand);
mainform.setCommandListener(this);
}
public void startApp() {
try{
img1=new ImageItem("預設影像控制元件",
Image.createImage("/Image.png"),
Item.LAYOUT_DEFAULT,
"第一張圖片");
img2=new ImageItem("預設影像控制元件",
Image.createImage("/Image.png"),
Item.LAYOUT_2|Item.LAYOUT_EXPAND|Item.LAYOUT_NEWLINE_BEFORE,
"第二張圖片");
}catch(Exception err){
System.out.println("can not load....");
}
mainform.append(img1);
mainform.append(img2);
Display.getDisplay(this).setCurrent(mainform);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c,Displayable d){
if(c==exitCommand){
destroyApp(false);
notifyDestroyed();
}
}
}
這是一個ImageItemt的演示程式,我在實現的前提下加了一點東西導致它異常,異常如下:
startApp threw an Exception
java.lang.NullPointerException
java.lang.NullPointerException
at ImageItemDemo.startApp(+64)
at javax.microedition.midlet.MIDletProxy.startApp(+7)
at com.sun.midp.midlet.Scheduler.schedule(+270)
at com.sun.midp.main.Main.runLocalClass(+28)
at com.sun.midp.main.Main.main(+116)
能找到異常原因嗎?
首先確定是由startApp丟擲空指標異常,其中用到的物件主要有兩個,mainform和img1、img2,然而image載入丟擲的應該可由catch(Exception err)捕獲到,所以基本可以確定是mainform產生的異常,可是問題來了,mainform我已經在建構函式里面例項化了,而且也是類的成員變數,應該隨物件存在,可是為什麼會異常呢?
百思不得其解。。。。
於是把ImageItemDemo()裡的程式碼移到startApp()裡面,發現居然實現了,可以確定,就是沒有例項化mainform。原因何在?難道是J2ME要先執行startApp才執行建構函式??答案是否定的。startApp()只是程式執行的切入點,物件和類的構造依然還是由建構函式完成。一個提示,那真的是建構函式嗎?
一個很明顯但是很容易被忽略的錯誤, public void ImageItemDemo(),它不是建構函式,甚至連建構函式的過載都不是,理由?限制了void型別。c++學了快1年了,確實沒有想過也沒有注意過這個問題,直接後果就是這樣,類在構造時候不會執行它,那麼其中的mainform自然不會被例項化,而依然只是一個引用,何以談的上操作?
改的方法很容易,把void去掉就可以了,就這麼一個簡單的問題,耗了我一天,最大的感覺就是自己學的不夠深,對理論觀點依舊不夠明確,所以寫下它引以為戒。
下面請看一段程式碼:
/*
* ImageItemDemo.java
*
* Created on 2005年7月24日, 下午1:45
*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
*
* @author mark
* @version
*/
public class ImageItemDemo extends MIDlet implements CommandListener{
private Command exitCommand=new Command("Exit",Command.EXIT,1);
private Form mainform;;
private ImageItem img1,img2;
public void ImageItemDemo(){
mainform=new Form("ImageItem Test");
mainform.append("顯示各種ImageItem");
mainform.addCommand(exitCommand);
mainform.setCommandListener(this);
}
public void startApp() {
try{
img1=new ImageItem("預設影像控制元件",
Image.createImage("/Image.png"),
Item.LAYOUT_DEFAULT,
"第一張圖片");
img2=new ImageItem("預設影像控制元件",
Image.createImage("/Image.png"),
Item.LAYOUT_2|Item.LAYOUT_EXPAND|Item.LAYOUT_NEWLINE_BEFORE,
"第二張圖片");
}catch(Exception err){
System.out.println("can not load....");
}
mainform.append(img1);
mainform.append(img2);
Display.getDisplay(this).setCurrent(mainform);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void commandAction(Command c,Displayable d){
if(c==exitCommand){
destroyApp(false);
notifyDestroyed();
}
}
}
這是一個ImageItemt的演示程式,我在實現的前提下加了一點東西導致它異常,異常如下:
startApp threw an Exception
java.lang.NullPointerException
java.lang.NullPointerException
at ImageItemDemo.startApp(+64)
at javax.microedition.midlet.MIDletProxy.startApp(+7)
at com.sun.midp.midlet.Scheduler.schedule(+270)
at com.sun.midp.main.Main.runLocalClass(+28)
at com.sun.midp.main.Main.main(+116)
能找到異常原因嗎?
首先確定是由startApp丟擲空指標異常,其中用到的物件主要有兩個,mainform和img1、img2,然而image載入丟擲的應該可由catch(Exception err)捕獲到,所以基本可以確定是mainform產生的異常,可是問題來了,mainform我已經在建構函式里面例項化了,而且也是類的成員變數,應該隨物件存在,可是為什麼會異常呢?
百思不得其解。。。。
於是把ImageItemDemo()裡的程式碼移到startApp()裡面,發現居然實現了,可以確定,就是沒有例項化mainform。原因何在?難道是J2ME要先執行startApp才執行建構函式??答案是否定的。startApp()只是程式執行的切入點,物件和類的構造依然還是由建構函式完成。一個提示,那真的是建構函式嗎?
一個很明顯但是很容易被忽略的錯誤, public void ImageItemDemo(),它不是建構函式,甚至連建構函式的過載都不是,理由?限制了void型別。c++學了快1年了,確實沒有想過也沒有注意過這個問題,直接後果就是這樣,類在構造時候不會執行它,那麼其中的mainform自然不會被例項化,而依然只是一個引用,何以談的上操作?
改的方法很容易,把void去掉就可以了,就這麼一個簡單的問題,耗了我一天,最大的感覺就是自己學的不夠深,對理論觀點依舊不夠明確,所以寫下它引以為戒。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10901326/viewspace-965655/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我的一點學習經驗 (轉)
- J2ME做專案的一些經驗 (轉)
- CCNA初學者學習經驗!(轉)
- 初學Oracle的一點心得Oracle
- 使用PACKAGE的一點經驗Package
- 初創企業獲得成功的幾點經驗
- 編譯核心的一點點經驗(轉)編譯
- 作培訓的一點經驗
- 給初學java的一點建議Java
- 關於Presentation Error的一點經驗Error
- 英文投稿的一點經驗【轉載】
- Linux配置mlterm的一點經驗(轉)Linux
- 寫給初級前端的面試經驗前端面試
- 從MySQL遷移到VoltDB的一點經驗MySql
- root檔案系統的一點經驗(轉)
- 【初學者必備】網路安全學習經驗彙總!
- Windows安裝tensorflow的一點人生的經驗Windows
- TRW2k一點點小小的經驗。 (290字)
- 我的一些學習經驗:ONVIF
- 初學UNIX C時的一點小收穫 (轉)
- 韓語學習經驗總結,給韓語初學者指路
- 在 Android 中實現 Redux 的一點經驗AndroidRedux
- 關於windows installer的一點小經驗(轉)Windows
- 程式設計入門到進大廠,分享一點學習經驗程式設計
- 一點脫殼經驗。(7千字)
- 初識javascript的一點點見解JavaScript
- 軟體工程管理的一點經驗之工程構建軟體工程
- VC6使用#pragma warning的一點經驗 (轉)
- UICollectionView: 糊一張裝飾檢視 Decoration View 的一點經驗UIView
- 初創公司資料科學專案全流程指南,一位資深資料科學家的經驗談資料科學
- java的個人學習經驗Java
- 程式設計師筆記(知識)管理的一點經驗程式設計師筆記
- 安裝oraclesoasuitex86101310的一點經驗OracleUI
- 解決繪圖時閃爍問題的一點經驗繪圖
- telock 0.85f的一點脫殼經驗 (770字)
- 我的英語學習經驗
- Laravel 初學者學習點滴Laravel
- 14 點自動化經驗