2011-01-22 2 views
6

В настоящее время я работаю с MIDlet (я использую Visual MIDlet) в Netbeans, и возникает исключение NullPointerException, но я не знаю почему.J2ME (Java) - Null Pointer Исключение, пойманное в классе отображения

Примечание: Исключение не выбрасывается, когда программа запускается на эмуляторе, только когда нажата кнопка OK.

Здесь ошибка я получаю

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 (это) ..... говоря, что утечка в конструкторе. Я переместил его в метод initialize(), который успокоил предупреждение, но исключение все еще происходит.

Любая помощь будет принята с благодарностью.

Спасибо, Том.

+0

Отладка всего в течение часа? У вас больше в баке. По серьезной ноте, сделайте глубокий вдох и уйдите на несколько часов. Вы обязательно получите его, если кто-то из SO не будет первым. – Mike

+0

Display.getDisplay (this), как говорят, течет, потому что «это» ускользает от конструктора. Однако, исходя из вашего конструктора, это вряд ли вызовет NullPointerEXception (поскольку все уже было инициализировано) –

ответ

3

EDIT: Мне, возможно, потребуется отредактировать свой ответ, потому что я думаю, что я сказал, что это не имеет отношения к делу, но я оставлю его вне возможности, что это может помочь!

Прошло много времени с тех пор, как я работал в J2ME, но, взглянув на какой-то старый код, я заметил, что никогда не делал ничего полезного в конструкторе. Я уверен, что ваш вызов Display.getDisplay (это) вызывает исключение NullPtrException, поскольку что-то еще не было инициализировано. На самом деле, я уверен, что использование этого указателя в конструкторе довольно точно вызывает такой тип ошибки.

Попытайтесь использовать Display в функции 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», прежде чем добавлять команды и слушателя, в Экран form1 все еще появляется, но когда вы нажимаете на команду, она поднимается выше ошибки.

Смежные вопросы