注: この Java 配備ガイドでは、Java SE 6 update 10 リリースより前にリリースされた機能について説明します。最新情報については、Java Rich Internet Application の開発および配備を参照してください。

Applet.start() または Applet.stop() が呼び出されると、java.lang.NullPointerException がスレッドからスローされる

症状

Sun Java™ Runtime Environment (JRE™) を使ってブラウザ内でアプレットを実行しているときに Applet.start() または Applet.stop() が呼び出されると、スレッドから java.lang.NullPointerException がスローされます。同じアプレットが Microsoft Virtual Machine (VM) では実行できます。

原因

Microsoft VM では、Applet.init() が呼び出されるとすぐ、Applet.start() が呼び出される前に、アプレットが可視状態になります。同様に、Applet.stop() のあとで Applet.destroy() が呼び出されるまでは、アプレットは可視状態のままです。

ライフサイクルメソッドに関して、Sun JRE の実装ではわずかですが、アプレットの可視性について異なります。そのため、Microsoft VM イベントシーケンスを前提としたアプレットはすべて停止する可能性があります。

解決方法

アプレットが描画前に可視状態になるように対策を講じたコードを記述します。その 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);   // java.lang.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);  
                }
        }

詳細情報

        なし。

 


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.