Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

java.lang.NullPointerException Брошенный От Потока, Когда Applet.start() или Applet.stop() Вызывается

Признаки

Выполняя апплет в браузере, используя Sun Среда выполнения Java™ (JRE™), a java.lang.NullPointerException бросается от потока когда Applet.start() или Applet.stop() вызывается. Тот же самый апплет работает под Microsoft Virtual Machine (VM).

Причина

В Microsoft VM апплет может сразу быть видимым после Applet.init() вызывается, но прежде Applet.start(). Точно так же апплет может все еще быть видимым после Applet.stop() но прежде Applet.destroy().

Реализация JRE Sun немного отличается с точки зрения видимости апплета, связанной с методами жизненного цикла, таким образом, любой апплет, который полагается на последовательности события Microsoft VM, может повредиться.

Разрешение

Кодируйте защитно, чтобы гарантировать, что апплет видим перед рисунком. Один способ сделать это должно протестировать ли Graphics объект является нулем. Например, предположите, что у апплета есть следующие методы:

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

Соответствующая информация

       Ни один.

 


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами