java.lang.NullPointerException 가 thread로부터 throw 된다... - xrath.com 에서 번역됨

> ## `Applet.start()` 또는 `Applet.stop()` 가 불려 가면(자),`java.lang.NullPointerException` 가 thread로부터 throw 된다

> ###
> 증상

> > 애플릿을 Sun JRE 를 사용한 브라우저로 실행하고 있는 경우,`Applet.start()` 또는 `Applet.stop()` 가 불려 가면(자),`NullPointerException` 가 thread로부터 throw 됩니다. 같은 애플릿이 Microsoft VM 에서는 실행할 수 있습니다.

> ### 원인

> > Microsoft VM 에서는,`Applet.init()` 가 불려 가자마자,`Applet.start()` 가 불려 가기 전에, 애플릿이 가시 상태가 됩니다. 같이`Applet.stop()` 의 다음에 `Applet.destroy()` 가 불려 갈 때까지는, 애플릿은 가시 상태인 채입니다.

> > 라이프 사이클 메소드에 관해서, Sun JRE 의 구현에서는 정확히 알 수 없는 것입니다만, 애플릿의 가시성에 대해 다릅니다. 그 때문에, Microsoft VM 이벤트 순서를 전제로 한 애플릿은 모두 정지할 가능성이 있습니다.

> ### 해결 방법

> > 애플릿이 draw전에 가시 상태가 되도록(듯이) 대책을 강의(강구)한 코드를 기술합니다. 그 1 개(살)에,`Graphics` 객체가 null 화도인지를 테스트하는 방법이 있습니다. 예를 들어, 애플릿에 다음의 메소드가 포함되어 있다고 합니다.

> > `private Thread paintThread = null;
> > `
> > `public void start()`
> > `{`
> > `if (paintThread == null)`
> > `{`
> > `paintThread = new Thread(this);`
> > `paintThread.start() ;`
> > `}`
> > `}`

> > `public void stop()`
> > `{`
> > `if (paintThread ! = null)`
> > `{`
> > `paintThread.interrupt() ; // Assuming the thread has sufficient // time to be interrupted and stop // drawing before destroy() is called.`
> > `paintThread = null;`
> > `}`
> > `}`
> > `public void run()`
> > `{`
> > `while (Thread.currentThread(). isInterrupted() == false)`
> > `{`
> > `Graphics g = getGraphics() ;`
> > `g.drawString("Hello World", 100, 100) ; // NullPointerException if // applet is not visible -
> > //``g will be null !`
> > `}`
> > `}`
> > `run` 메소드의 코드를 다음과 같이 변경합니다.

> > `public void run()`
> > `{`
> > `while (Thread.currentThread(). isInterrupted() == false)`
> > `{`
> > `Graphics g = getGraphics();`

> > `if (g ! = null) // Code defensively!`
> > `g.drawString("Hello World", 100, 100) ;`
> > `}`
> > `}`

> ### 상세 정보

> 없음