初学J2ME的一点经验

王朝java/jsp·作者佚名  2006-01-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去掉就可以了,就这么一个简单的问题,耗了我一天,最大的感觉就是自己学的不够深,对理论观点依旧不够明确,所以写下它引以为戒。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有