为什么我无法使用我的课程实例创建新的线程?

问题描述:

我想知道,为什么下面的代码不工作:为什么我无法使用我的课程实例创建新的线程?

public class ClockRunnable extends Applet implements Runnable { 

Thread m_zeit; 
Thread m_background; 

public void init() { 
    m_zeit = new Thread(new ClockRunnable()); 
    m_background = new Thread(new Background()); 

    m_zeit.start(); 
    m_background.start(); 

    } 
} 

这当然只是一个示例代码。我想知道,因为如果我创建一个新的背景线程它像上面写的那样工作。但是如果我为我的ClockRunnable类调用一个新的线程,它会抛出一个NullPointerExecption。 但是,如果我改变新线程命令

 m_zeit = new Thread(this); 

它完美。

如果上面的例子是不够的,这里是整个代码+ ERROROUTPUT:

import java.util.*; 
import java.text.*; 
import java.awt.*; 
import java.applet.*; 

public class UhrzeitRunnable extends Applet implements Runnable { 
String m_aktZeit; 
DateFormat m_formatierer; 
Font m_anzeigeFont; 
Color m_farbe; 
Thread m_zeit; 
Thread m_background; 

public void init() { 
    m_anzeigeFont = new Font("Serif",Font.BOLD,22); 
    m_formatierer = DateFormat.getTimeInstance(); 
    m_aktZeit = m_formatierer.format(new Date()); 
    m_zeit = new Thread(new UhrzeitRunnable()); // if I change it to "this" it works 
    m_background = new Thread(new Background()); 
    m_zeit.start(); 
    m_background.start(); 

} 

public void run() { 
    while(true) { 
     m_aktZeit = m_formatierer.format(new Date()); //NullPointerExeption on this line 
     repaint(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      return; 
     } 
    } 
} 

public void start() { 
    if(m_zeit == null) { 
     m_zeit = new Thread(new UhrzeitRunnable()); 
     m_zeit.start(); 
    } 
    if (m_background==null) { 
     m_background = new Thread(new Background()); 
     m_background.start(); 
    } 
} 

public void stop() { 
    if(m_zeit!=null){ 
     m_zeit.interrupt(); 
     m_zeit = null; 
    } 
} 

public void destroy() { 
    if(m_zeit !=null) { 
     m_zeit.interrupt(); 
     m_zeit = null; 
    } 
} 

public void paint(Graphics g) { 
    g.setFont(m_anzeigeFont); 
    g.setColor(Color.blue); 
    this.setBackground(m_farbe); 
    g.drawString(m_aktZeit, 20, 45); 
} 


public class Background implements Runnable { 
public void run() { 
    while (true) { 
     m_farbe = new Color((int) (255*Math.random()),(int) (255*Math.random()), (int)(255*Math.random())); 
      repaint(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 

     } 
    } 
} 
} 
} 

和错误输出。顺便说一下,后台线程完美地工作。

Exception in thread "Thread-3" java.lang.NullPointerException 
at kapitel15.UhrzeitRunnable.run(UhrzeitRunnable.java:29) 
at java.lang.Thread.run(Unknown Source) 
+1

小苹果是一种奇怪的怪兽,而你在其中一个构造函数上调用是非常罕见的。通常这是通过网页的小程序驱动程序完成的(无论它被称为什么)。当你调用构造函数时,init()不会被调用,留下一些字段为空。 – 2014-09-20 21:32:30

+0

谢谢!如果你将这个答案作为正式答案,我会马上将其标记为我接受的答案!这正是我需要的答案。 – Cappuccino90 2014-09-20 21:38:35

小卒是奇怪的怪物,而你在一个上调用构造函数是非常罕见的。通常这是通过网页的Java applet驱动程序完成的,该驱动程序然后调用Applet的init方法。而当你确实调用构造函数时,init()不会被调用,将一些关键字段留空。但是,你为什么要这样做?您创建的Applet与正在显示的Applet完全不同,并且其状态更改不会反映在显示的对象中。