2011-01-22 2 views
6

현재 Netbeans에서 MIDlet (Visual MIDlet을 사용하고 있습니다)을 사용하고 있으며 NullPointerException이 발생하지만 이유를 알지 못합니다.J2ME (Java) - Null 포인터 예외 표시 클래스에 걸렸습니다.

참고 : 확인 명령 단추를 누른 경우에만 프로그램이 에뮬레이터에서 실행될 때 예외가 throw되지 않습니다. 여기

난 당신이 쉽게 읽을 수 있도록 나는 예외와 관련이없는 모든 코드를 제거했다

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) 

를 얻을 오류입니다. 아래 코드는 위의 예외를 throw하는 코드 인 경우 단순화 된 버전입니다.

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

}

나는 더 우선으로 한 시간 이상이 문제를 해결하기 위해 노력하고있다. 나는 가치가 언급 생각할 수 있는 유일한 방법은 다음과 같습니다

  • 넷빈즈 생성자에서 누수가 있었다라고 ..... 라인 Display.getDisplay (이)가을 경고했다. 나는 경고를 진정시키는 initialize() 메소드로 옮겼지만 예외는 여전히 발생합니다.

도움을 주시면 대단히 감사하겠습니다.

감사합니다. Tom.

+0

한 시간 동안 만 디버깅 하시겠습니까? 당신은 탱크 안에 더 있습니다. 진지한 메모를 듣고 심호흡을하고 몇 시간 동안 걸어 나갑니다. 그렇게 생각한 사람이 먼저 오지 않으면 분명히 얻을 수 있습니다. – Mike

+0

Display.getDisplay (this)는 'this'가 생성자를 이스케이프 처리하기 때문에 누출된다고합니다. 그러나 귀하의 생성자를 기반으로,이 NullPointerException (모든 것이 이미 초기화되었습니다)을 일으킬 가능성이 희박합니다 –

답변

3

편집 : 내가 말한 내용이 적절하지 않다고 생각하기 때문에 답을 수정해야 할 수도 있지만 도움이 될 수있는 기회를 놓치지 마라.

J2ME에서 작업 한 이후로 오랜 시간이 걸렸지 만, 생성자에서 유용하지 않은 것을 전혀 알지 못했던 몇 가지 오래된 코드를 살펴 보았습니다. Display.getDisplay (this)에 대한 호출이 아직 초기화되지 않았기 때문에 NullPtrException을 발생시키고 있습니다. 사실, 나는이 생성자에서 this 포인터를 사용하는 것이 이런 유형의 에러를 발생시키는 것이 확실하다.

startApp() 함수에서 Display를 처리하고,이 코드가 올바르다면 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 화면이 계속 나타나지만 명령을 누르면 위의 오류가 발생합니다.

관련 문제