我想知道,为什么以下代码不起作用:
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类调用一个新的Thread,它会抛出一个NullPointerExecption。 但是,如果我将新的Thread命令更改为
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)
答案 0 :(得分:2)
小程序是奇怪的野兽,你在一个上调用构造函数是很不寻常的。通常这是由网页的Java小程序驱动程序完成的,然后该小程序驱动程序调用Applet的init方法。当你调用构造函数时,不调用init(),使一些关键字段为null。但是你为什么要这样做呢?您创建的Applet是与正在显示的对象完全不同的对象,其状态的更改不会反映在显示的对象中。