posts - 33,comments - 21,trackbacks - 0

今天改代码的时候,遇到一个很郁闷的问题,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)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: