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 をスローclockFormします。null

static void解決策は、行から削除すること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 に答える