2

我写了以下内容Java Application

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();



    }
}

但是当我运行它时,它exception在最后一行给了我以下内容startApp()

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)
4

2 回答 2

2

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

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

抛出 NPE ,因为在这一点上clockFormnull

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

public JavaApplication6() throws Exception

在这种情况下,它成为构造函数,一切都会正常工作。

祝你好运。

于 2012-05-13T06:35:31.247 回答
-3

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

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

问题是,因为JavaApplication6 类扩展了 MIDlet,所以以下行将在任何正常运行的 MIDP 实现中抛出运行时异常(阅读:在任何正常工作的设备上):

JavaApplication6 test=new JavaApplication6(); // SecurityException in runtime

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

这在MIDlet 构造函数 javadocs中有明确解释,请注意以下内容Throws

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.
于 2012-05-14T09:42:48.960 回答