明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

初學(xué)J2ME的一些經(jīng)驗(yàn)

[摘要]與其說(shuō)是學(xué)J2ME的經(jīng)驗(yàn),倒不如說(shuō)是類C++語(yǔ)言的一點(diǎn)注意事項(xiàng),之所以這么說(shuō),是因?yàn)檫@個(gè)問(wèn)題是在學(xué)J2ME時(shí)候發(fā)現(xiàn)的,整整折騰了我一天,雖然只是一點(diǎn)小的失誤,但是直接后果是程序不斷異常,所以我把它寫(xiě)出來(lái),一方面提醒自己,學(xué)知識(shí)不能淺嘗輒止,而應(yīng)該多問(wèn)為什么,不僅知其然還要知所以然,另一方面也告訴更...
與其說(shuō)是學(xué)J2ME的經(jīng)驗(yàn),倒不如說(shuō)是類C++語(yǔ)言的一點(diǎn)注意事項(xiàng),之所以這么說(shuō),是因?yàn)檫@個(gè)問(wèn)題是在學(xué)J2ME時(shí)候發(fā)現(xiàn)的,整整折騰了我一天,雖然只是一點(diǎn)小的失誤,但是直接后果是程序不斷異常,所以我把它寫(xiě)出來(lái),一方面提醒自己,學(xué)知識(shí)不能淺嘗輒止,而應(yīng)該多問(wèn)為什么,不僅知其然還要知所以然,另一方面也告訴更多像我這樣初學(xué)的朋友不要犯相同的錯(cuò)誤。

  下面請(qǐng)看一段代碼:

  /*
   * 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("默認(rèn)圖像控件",
   Image.createImage("/Image.png"),
   Item.LAYOUT_DEFAULT,
   "第一張圖片");
   img2=new ImageItem("默認(rèn)圖像控件",
   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();
   }
   }
  }


  這是一個(gè)ImageItemt的演示程序,我在實(shí)現(xiàn)的前提下加了一點(diǎn)東西導(dǎo)致它異常,異常如下:

  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拋出空指針異常,其中用到的對(duì)象主要有兩個(gè),mainform和img1、img2,然而image載入拋出的應(yīng)該可由catch(Exception err)捕獲到,所以基本可以確定是mainform產(chǎn)生的異常,可是問(wèn)題來(lái)了,mainform我已經(jīng)在構(gòu)造函數(shù)里面實(shí)例化了,而且也是類的成員變量,應(yīng)該隨對(duì)象存在,可是為什么會(huì)異常呢?

  百思不得其解。。。。

  于是把ImageItemDemo()里的代碼移到startApp()里面,發(fā)現(xiàn)居然實(shí)現(xiàn)了,可以確定,就是沒(méi)有實(shí)例化mainform。原因何在?難道是J2ME要先執(zhí)行startApp才執(zhí)行構(gòu)造函數(shù)??答案是否定的。startApp()只是程序運(yùn)行的切入點(diǎn),對(duì)象和類的構(gòu)造依然還是由構(gòu)造函數(shù)完成。一個(gè)提示,那真的是構(gòu)造函數(shù)嗎?

  一個(gè)很明顯但是很容易被忽略的錯(cuò)誤, public void ImageItemDemo(),它不是構(gòu)造函數(shù),甚至連構(gòu)造函數(shù)的重載都不是,理由?限制了void類型。c++學(xué)了快1年了,確實(shí)沒(méi)有想過(guò)也沒(méi)有注意過(guò)這個(gè)問(wèn)題,直接后果就是這樣,類在構(gòu)造時(shí)候不會(huì)執(zhí)行它,那么其中的mainform自然不會(huì)被實(shí)例化,而依然只是一個(gè)引用,何以談的上操作?

  改的方法很容易,把void去掉就可以了,就這么一個(gè)簡(jiǎn)單的問(wèn)題,耗了我一天,最大的感覺(jué)就是自己學(xué)的不夠深,對(duì)理論觀點(diǎn)依舊不夠明確,所以寫(xiě)下它引以為戒。