今天改代码的时候,遇到一个很郁闷的问题,J2me 程序运行时抛出一个空指针异常,经过反复研究,发现问题所在,的确是自己的基础知识不过关导致。
参考文章如下:http://www.jcwcn.com/html/Java/10_43_37_918.htm
在改普通例程变mvc架构例程的过程中,学到了太多的东西,这些天的工作笔记和学习心得记叙着这一切。
简单说明一下,源程序是个电话簿例程,就一个文件,所有的事务逻辑处理视图都写在一起,我要做的工作就是将其分离开来,按照MVC架构的模式重新改写。
源程序中有这样一段,启动后显示mainForm主菜单界面
public void startApp() {
mainForm();
}
public void mainForm() {
List l = new List("我的电话本", Choice.IMPLICIT);
l.append("查看所有电话", null);
l.append("新增电话记录", null);
l.append("查找电话记录", null);
l.append("退出电话本", null);
l.setCommandListener(this);
display.setCurrent(l);
}
现在我要把这个mainForm从中主程序分离出来,单独提出来写在ui的包中,不过,出现了空指针异常
java.lang.NullPointerException
java.lang.NullPointerException
at com.wiser.mvctest.ui.UIController.setCurrent(+5)
at com.wiser.mvctest.ui.UIController.displayWelcome(+8)
at com.wiser.mvctest.ui.UIController.init(+16)
at com.wiser.mvctest.AddrBookMIDlet.startApp(+19)
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)
单提出来的MainMenuForm文件代码如下
package com.wiser.mvctest.ui;
import javax.microedition.lcdui.*;
import com.wiser.mvctest.ui.UIController;
import javax.microedition.lcdui.List;
public class MainMenuForm extends List implements CommandListener {
private UIController uicontroller;
public MainMenuForm(UIController uicontroller) {
super("我的电话本", Choice.IMPLICIT);// 调用父类list的构造方法
this.uicontroller = uicontroller;
this.append("查看所有电话", null);
this.append("新增电话记录", null);
this.append("查找电话记录", null);
this.append("退出电话本", null);
this.setCommandListener(this);
}
public void commandAction(Command c, Displayable s) {
if (c == List.SELECT_COMMAND) {
List temp = (List) s;
switch (temp.getSelectedIndex()) {
case 0: // 选择0,则传EVENT_ALL_LIST_FORM这个参数到handleEvent方法,查看所有电话
uicontroller.handleEvent(
UIController.EventID.EVENT_ALL_LIST_FORM, null);
break;
case 1:// 选择1,则传EVENT_NEW_RECORD_FORM这个参数到handleEvent方法,新增电话记录
uicontroller.handleEvent(
UIController.EventID.EVENT_NEW_RECORD_FORM, null);
break;
case 2:// 选择2,则传EVENT_SEARCH_RECORD_FORM这个参数到handleEvent方法,查找电话记录
uicontroller.handleEvent(
UIController.EventID.EVENT_SEARCH_RECORD_FORM, null);
break;
case 3:// 选择3,则传EVENT_EXIT_FORM这个参数到handleEvent方法,退出电话本
uicontroller.handleEvent(UIController.EventID.EVENT_EXIT_FORM,
null);
break;
default:
break;
}
}
}
}
UIController是我写的一个界面控制器,其中要求显示MainMenuForm界面的源代码如下
public void init() {
mainMenuForm = new MainMenuForm(this);
setCurrent(mainMenuForm);
}
初始化MainMenuForm后,将其传入setCurrent。
那么很明显上面的MainMenuForm界面代码是没有错误的,而且,在异常里看,问题应该就出在UIController的setCurrent,那么这个空指针到底是为什么呢?在网上搜索了一下,发现一个人的学习笔记,他的问题是构造函数加了void的问题,而我的构造函数是正确的;再查看api,setCurrent要求的参数是setCurrent(Displayable dis),而里面的MainMenuForm也已经初始化了,为什么还找不到呢?
这就是我当时的想法,很混乱,迷惑,而实际上这和MainMenuForm没有关系,空指针空的是当前的界面对象,也就是程序最开始什么界面都没有,或者说就是display这个对象是空的,那么如果display是空的,那他的方法setCurrent自然不能用,这才是原因所在,现在我在UIController的init方法中添加这样一句
this.display = Display.getDisplay(addrbookmidlet); // addrbookmidlet在UIController构造函数中得到
这样就可以了。
问题解决完了,对J2ME的理解又深了一步,并且对java的基础知识也进一步巩固了。
待我理清思路再重新来看一下,现在继续工作。
posted on 2007-01-31 12:32
英明 阅读(659)
评论(0) 编辑 收藏