J2ME (Java) - исключение пустого указателя в классе отображения - PullRequest
6 голосов
/ 22 января 2011

В настоящее время я работаю с MID-летами (я использую Visual MIDlet) в Netbeans, и создается исключение NullPointerException, но я не знаю, почему.

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

Вот ошибка, которую я получаю

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

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

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

Ответы [ 4 ]

3 голосов
/ 24 января 2011

РЕДАКТИРОВАТЬ: Возможно, мне нужно отредактировать мой ответ, потому что я думаю, что то, что я сказал, не имеет значения, но я оставлю это на случай, что это может помочь!

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

Попробуйте поработать с Display в функции startApp (), и если этот код, на который я ссылаюсь, верен, вы должны оставить логическое значение, которое отмечает, был ли ваш мидлет инициализирован или нет.

Вы можете посмотреть мой старый код для справки:

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

1 голос
/ 24 июня 2011

Я тоже это заметил ....

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);

и всегда получал исключение нулевого указателя ... Это работает хорошо, но кажется, что мы слишком часто забываем об этом, когда наш код становится слишком сложным ^^

1 голос
/ 24 января 2011

Может быть, вам нужно добавить

form1.setCommandListener (this);

0 голосов
/ 26 июня 2012

Вы должны сделать по порядку:

  • form1.setCommandListener
  • form1.addCommand ..
  • ....
  • в конце концов: MIDlet.getDisplay.setCurrent(form1);

Если вы вызываете 'setCurrent' перед добавлением команд и прослушивателя, экран form1 все равно появляется, но когда вы нажимаете команду, он поднимается выше ошибки.

...