与其说是学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_2item.layout_expanditem.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去掉就可以了,就这么一个简单的问题,耗了我一天,最大的感觉就是自己学的不够深,对理论观点依旧不够明确,所以写下它引以为戒。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器