我写了下面的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();
}
}但是当我运行它时,它在startApp()的最后一行给出了下面的exception;
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)发布于 2012-05-13 14:35:31
您创建了名为JavaApplication6的静态方法,因为它是构造函数。但事实并非如此。所以当你说JavaApplication6 test=new JavaApplication6();的时候,它不会被调用。因此,clockForm保持未初始化状态,即null。所以,行
Display.getDisplay(this).setCurrent(clockForm);
抛出NPE,因为此时clockForm为null。
解决方案是从public static void JavaApplication6() throws Exception行中删除static void。它应该看起来像
public JavaApplication6() throws Exception
在这种情况下,它变成了构造器,一切都会正常工作。
祝好运。
发布于 2012-05-14 17:42:49
你似乎正在以一种根本错误的方式来处理事情。
我的意思是,即使你设法弄清楚并破解了所有空指针异常,你也不会得到有效的MIDlet应用程序代码。
事情是这样的,因为类JavaApplication6扩展了MIDlet,下面这行代码将在任何正常工作的MIDP实现中抛出运行时异常(即:在任何正常工作的设备上):
JavaApplication6 test=new JavaApplication6(); // SecurityException in runtime这就是MIDP (JSR 118) API指定事物的方式。上面一行表示应用程序试图绕过AMS调用MIDlet构造函数,这将导致运行时出现SecurityException。
这在MIDlet constructor 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.https://stackoverflow.com/questions/10569761
复制相似问题