首 页 ┆ 源码下载 ┆ IT学院 ┆ 字体下载 ┆ 模板下载 ┆ 源码发布 ┆ 广告合作 ┆ 网站地图 ┆ 虚拟主机 ┆ 中文域名
► 设为首页
► 加入收藏
► 联系我们
源码下载 >> ASP源码 | PHP源码 | ASP.net源码 | JSP源码 | CGI源码 | VC/C++源码 | VB源码 | Delphi源码 | Flash源码
文章学院 >> 网络编程 | 网页设计 | 图形图象 | 数据库 | 服务器 | 网络媒体 | 网络安全 | 操作系统 | 办公软件 | 软件开发 | 黑客知识
字体下载 >> 精制字体 | 非英字体 | 艺术字体 | 著名字体 | 哥特式 | 简单字体 | 手写体 | 节假日 | 图案字体 | 精度像素 | 中文字体
模板下载 >> 企业门户 | 数码网络 | 休闲娱乐 | 影视音乐 | 旅游名胜 | 文化艺术 | 电子商务 | 个性展示 | 登陆导航 | Flash模板
►►您当前的位置:源码园 → IT学院 → 软件开发 → Java编程 → 文章内容

初学J2ME的一点经验

作者:mark0402…  来源:网上收集  发布时间:2005-11-15 10:49:09
  与其说是学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去掉就可以了,就这么一个简单的问题,耗了我一天,最大的感觉就是自己学的不够深,对理论观点依旧不够明确,所以写下它引以为戒。


[] [返回上一页] [打 印]
  • 上一篇文章:在Visual C++中使用内联汇编
  • 下一篇文章:JNI完全手册

  • 相关文章:
  • 初学J2ME的一点经验
  • 长期使用中型Access数据库的一点经验
  • 新手入门:学习Java的一点经验心得
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 源码发布
Copyright © 2003-2009 Ymyasp.Com. All Rights Reserved .
备案序号:粤ICP备07029071号