2012-05-13 70 views
2

我寫了下面的Java Application的NullPointerException在一個MIDlet

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) 

回答

2

您創建了靜態方法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

在這種情況下,它變成構造,一切都將正常工作。

祝你好運。

+0

仍然是一個NPE,但這次是在差異部分,這一次它給人的例外在** clockForm =新表(」時鐘「)** – lonesome

-1

你似乎以一種根本錯誤的方式接近事物。

我的意思是,即使你設法通過所有的空指針異常來判斷和破解,你也不會得到一個有效的MIDlet應用程序代碼。

事情是,因爲類JavaApplication6擴展的MID​​let,下面一行將拋出運行時異常,在任何正常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. 
+0

所以你告訴我沒有辦法讓我的應用程序工作? – lonesome

+0

@ user1064929爲什麼?有數以萬計的midlets在那裏工作得很好。爲了讓您的工作與數千人一樣工作,請編寫正確的代碼。首先,您可以放下所有內容的'main',並找到一種方法來獲得您需要的東西。點擊你的問題下的'midp'標籤查找教程,如果你有興趣 – gnat

+0

坦率地說,它的教程代碼! – lonesome