首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIDLet中的nullPointerException

MIDLet中的nullPointerException
EN

Stack Overflow用户
提问于 2012-05-13 14:24:29
回答 2查看 766关注 0票数 2

我写了下面的Java Application

代码语言:javascript
复制
import java.util.Timer;
import java.util.TimerTask;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.StringItem;
import javax.microedition.midlet.MIDlet;


public class JavaApplication6 extends MIDlet
{
private static Form clockForm=null;
private static StringItem clockItem=new StringItem("hello", "World!");
private static ClockTask task=null;
private static Timer timer=null;

static class ClockTask extends TimerTask 
{
private int count=0;
        @Override
public void run()
{
count++;
clockItem.setText("hello "+count);
}
}
public static  void JavaApplication6() throws Exception
{
clockForm=new Form("Clock");
clockItem=new StringItem("","0");
clockForm.append(clockItem);
}

    @Override
public  void startApp()
{
task=new ClockTask();
timer=new Timer();
timer.schedule(task,1000,1000);
Display.getDisplay(this).setCurrent(clockForm);}

    @Override
public void pauseApp()
{}

public void destroyApp(boolean unconditional)
{}


    public static void main(String[] args) {


        JavaApplication6 test=new JavaApplication6();
        test.startApp();



    }
}

但是当我运行它时,它在startApp()的最后一行给出了下面的exception

代码语言:javascript
复制
Exception in thread "main" java.lang.NullPointerException
    at javax.microedition.lcdui.Display.<init>(Display.java:420)
    at javax.microedition.lcdui.Display.getDisplay(Display.java:447)
    at javaapplication6.JavaApplication6.startApp(JavaApplication6.java:42)
    at javaapplication6.JavaApplication6.main(JavaApplication6.java:56)
EN

回答 2

Stack Overflow用户

发布于 2012-05-13 14:35:31

您创建了名为JavaApplication6的静态方法,因为它是构造函数。但事实并非如此。所以当你说JavaApplication6 test=new JavaApplication6();的时候,它不会被调用。因此,clockForm保持未初始化状态,即null。所以,行

Display.getDisplay(this).setCurrent(clockForm);

抛出NPE,因为此时clockFormnull

解决方案是从public static void JavaApplication6() throws Exception行中删除static void。它应该看起来像

public JavaApplication6() throws Exception

在这种情况下,它变成了构造器,一切都会正常工作。

祝好运。

票数 2
EN

Stack Overflow用户

发布于 2012-05-14 17:42:49

你似乎正在以一种根本错误的方式来处理事情。

我的意思是,即使你设法弄清楚并破解了所有空指针异常,你也不会得到有效的MIDlet应用程序代码。

事情是这样的,因为类JavaApplication6扩展了MIDlet,下面这行代码将在任何正常工作的MIDP实现中抛出运行时异常(即:在任何正常工作的设备上):

代码语言:javascript
复制
JavaApplication6 test=new JavaApplication6(); // SecurityException in runtime

这就是MIDP (JSR 118) API指定事物的方式。上面一行表示应用程序试图绕过AMS调用MIDlet构造函数,这将导致运行时出现SecurityException。

这在MIDlet constructor javadocs中解释得很清楚,请注意Throws中所述的内容:

代码语言:javascript
复制
protected MIDlet()

    Protected constructor for subclasses. The application management software
    is responsible for creating MIDlets and creation of MIDlets is restricted.
    MIDlets should not attempt to create other MIDlets.

Throws:
    SecurityException - unless the application management software is creating
    the MIDlet.
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10569761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档