下面請看一段代碼:
/* * ImageItemDemo.Java * * Created on 2005年7月24日, 下午1:45 */ import Javax.microedition
, "第一張圖片"); 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.NullPointerExceptionJava.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往掉就可以了,就這麼一個簡略的標題,耗了我一天,最大的感到就是自己學的不夠深,對理論觀點依舊不夠明白,所以寫下它引認為戒。