2011-01-22 16 views
6

में नल पॉइंटर अपवाद पकड़ा गया है, मैं वर्तमान में नेटबीन्स में मिडलेट्स (मैं विजुअल मिडलेट का उपयोग कर रहा हूं) के साथ काम कर रहा हूं, और एक नलपोइंटर एक्सेप्शन फेंक दिया जा रहा है लेकिन मुझे नहीं पता कि क्यों।जे 2 एमई (जावा) - डिस्प्ले क्लास

नोट: जब प्रोग्राम ओमुलेटर पर चलता है तो अपवाद नहीं फेंक दिया जाता है, केवल जब ओके कमांड बटन दबाया जाता है।

यहाँ त्रुटि मैं

TRACE: <at java.lang.NullPointerException: 0>, Exception caught in Display class 
java.lang.NullPointerException: 0 
     at javax.microedition.lcdui.Display$ChameleonTunnel.callScreenListener(), bci=46 
     at com.sun.midp.chameleon.layers.SoftButtonLayer.processCommand(), bci=74 
     at com.sun.midp.chameleon.layers.SoftButtonLayer.soft1(), bci=37 
     at com.sun.midp.chameleon.layers.SoftButtonLayer.keyInput(), bci=36 
     at com.sun.midp.chameleon.CWindow.keyInput(), bci=38 
     at javax.microedition.lcdui.Display$DisplayEventConsumerImpl.handleKeyEvent(), bci=17 
     at com.sun.midp.lcdui.DisplayEventListener.process(), bci=277 
     at com.sun.midp.events.EventQueue.run(), bci=179 
     at java.lang.Thread.run(Thread.java:619) 

मिल रहा कोड अपवाद के लिए असंबंधित के सभी बाहर छीन लिया है, ताकि आप इसे आसानी से पढ़ा जा सकता है। यदि मेरे पास कोड है, तो उपरोक्त अपवाद फेंकता है, तो नीचे एक सरलीकृत संस्करण है।

package stMidlet; 

import javax.microedition.midlet.*; 
import javax.microedition.lcdui.*; 

public class StoryMidlet extends MIDlet implements CommandListener { 

    private boolean midletPaused = false; 
    private Command commandOk1; 
    private Form form1; 
    private TextField textField1; 

    public StoryMidlet() { 
     commandOk1 = new Command("Ok", Command.OK, 1); 
     textField1 = new TextField("Enter value: ", null, 120, TextField.ANY); 
     form1 = new Form(null, new Item[]{textField1}); 
     form1.addCommand(commandOk1); 
Display.getDisplay(this).setCurrent(form1); 
    } 

/* There were some methods here pre-inserted by netbeans. */ 

/* I have not changed these, but I can post them if you need me too */ 

/* initialize() */ 

/* startMIDlet() */ 

/* resumeMidlet() */ 

/* switchDisplayable */ 


/* getDisplay() */ 

/* exitMidlet() */ 

/* startApp() */ 

/* pauseApp() */ 

/* destroyApp() */ 


    public void commandAction(Command c, Displayable d) { 
     if (c == commandOk1) 
     { 
      System.out.println("Test"); 
     } 
    } 

}

मैं, कम से कम एक घंटे के लिए इस हल करने की कोशिश की है कोई प्रबल साथ। केवल एक चीज मैं लायक उल्लेख के बारे में सोच सकता है:

  • Netbeans कह निर्माता में इसका रिसाव हो रहा था लाइन Display.getDisplay (यह) के साथ एक चेतावनी से पता चला है .....। मैंने इसे प्रारंभिक() विधि में स्थानांतरित कर दिया जो चेतावनी को sedated, लेकिन अपवाद अभी भी होता है।

किसी भी मदद की सराहना की जाएगी।

धन्यवाद, टॉम।

+0

केवल एक घंटे के लिए डिबगिंग? आपके पास टैंक में अधिक है। एक गंभीर नोट पर, गहरी सांस लें और कुछ घंटों तक चले जाओ। एसओ पर कोई व्यक्ति पहले नहीं होता है तो आपको निश्चित रूप से यह मिल जाएगा। – Mike

+0

Display.getDisplay (यह) रिसाव कहा जाता है क्योंकि 'यह' कन्स्ट्रक्टर से बच रहा है। हालांकि, आपके कन्स्ट्रक्टर सेट अप के आधार पर, यह NullPointerEXception का कारण बनने की संभावना नहीं है (जैसा कि सबकुछ पहले ही शुरू हो चुका है) –

उत्तर

3

संपादित करें: मुझे अपने जवाब को फिर से करने की आवश्यकता हो सकती है क्योंकि मुझे लगता है कि मैंने जो कहा वह प्रासंगिक नहीं है, लेकिन मैं इसे ऑफ-मौके पर छोड़ दूंगा जिससे यह मदद मिल सके!

यह लंबे समय से रहा है क्योंकि मैंने जे 2 एमई में काम किया है, लेकिन कुछ पुराने कोड को देखते हुए मैंने देखा कि मैंने कभी भी कन्स्ट्रक्टर में उपयोगी कुछ भी नहीं किया है। मैं अपनी कॉल को डिस्प्ले पर सट्टेबाजी कर रहा हूं .getDisplay (यह) एक NullPtrException पैदा कर रहा है क्योंकि अभी तक कुछ प्रारंभ नहीं किया गया है। असल में, मुझे यकीन है कि इस पॉइंटर का उपयोग कन्स्ट्रक्टर में इस प्रकार की त्रुटि के कारण काफी निश्चित है।

startApp() फ़ंक्शन में डिस्प्ले से निपटने का प्रयास करें, और यदि यह कोड मैं संदर्भित कर रहा हूं तो सही है, तो आपको एक बूलियन रखना चाहिए जो आपके MIDlet को अभी तक प्रारंभ किया गया है या नहीं।

आप यहाँ संदर्भ के लिए मेरा कुछ पुराने कोड देख सकते हैं:

http://code.google.com/p/jmingle/source/browse/trunk/src/org/oep/jmingle/JMingle.java#68

1

शायद तुम

form1.setCommandListener (यह) जोड़ने की जरूरत है;

1

मैं भी इसे देखा ....

public Welcome(String k, ChatApp c) { 
     super(k); 
     name = new TextField("Name", "", 140, TextField.ANY); 
     exit = new Command("Exit", Command.EXIT, 0); 
     enter = new Command("Enter", Command.OK, 0); 
     midlet = c; 
     this.append(name); 
     this.addCommand(exit); 
     this.addCommand(enter); 
    } 

this.setCommandListener(this); 

कमी रह गई थी और हमेशा अशक्त-सूचक अपवाद मिल गया ...यह अच्छी तरह से काम करता है लेकिन ऐसा लगता है कि हम भी अक्सर जब हमारे कोड बहुत जटिल ^^ हो जाता है इसे भूल जाओ

+0

+1 धन्यवाद, आपने मुझे उस हिस्से पर पकड़ा –

0

आप क्रम में करना चाहिए: ..

  • form1.setCommandListener
  • form1.addCommand
  • ....
  • सब के बाद: MIDlet.getDisplay.setCurrent(form1);

आप आदेशों और श्रोता, जोड़ने से पहले 'setCurrent' आह्वान हैं फॉर्म 1 स्क्रीन अभी भी दिखाई देती है लेकिन जब आप कमांड दबाते हैं, तो यह त्रुटि से ऊपर उठता है।

संबंधित मुद्दे