我的一个朋友和我必须用java编写一个大学游戏。我正在尝试在我们创建的工具栏中实现一个小时钟。当我运行代码时,会出现此错误:
线程“Thread-0”中的异常java.lang.NullPointerException at GameTimer.run(GameTimer.java:29)
KodeKsToolBar.java
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import javax.swing.*;
public class KodeKsToolBar extends JToolBar{
private static final long serialVersionUID = 1L;
public static JLabel timeLabel;
public KodeKsToolBar(GUI listener, Dimension size){
//unimported Stuff hidden
//...
JLabel timeLabel = new JLabel(GameTimer.currentTime);
GameTimer t = new GameTimer();
t.start();
//clock = new Clock(this);
//clock.start();
setFloatable(false);
add(ToolBarItem_NGame);
add(ToolBarItem_Load);
add(ToolBarItem_Save);
add(ToolBarItem_Resign);
add(toolBarItem_PauseResume);
add(timeLabel);
}
}
GameTimer.java:
import java.awt.*;
import java.awt.event.*;
import java.text.DateFormat;
import java.util.Date;
public class GameTimer extends Thread {
static boolean running = true;
int milliSeconds = 0;
int seconds = 0;
int minutes = 0;
static String currentTime = "00:00";
public void run() {
while(running) {
milliSeconds++;
if(milliSeconds > 999){
milliSeconds = 0;
seconds++;
}
if(seconds > 59){
seconds = 0;
minutes++;
}
KodeKsToolBar.timeLabel.setText(getTime()); // <-- This is the line mentioned above, which causes the error
try {
Thread.sleep(10);
} catch (InterruptedException e2) {
e2.printStackTrace();
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e2) {
e2.printStackTrace();
}
}
public String getTime() {
currentTime = minutes + ":" + seconds;
return currentTime;
}
}
答案 0 :(得分:3)
您正在访问静态变量
KodeKsToolBar.timeLabel
但在KodeKsToolBar
构造函数
JLabel timeLabel = new JLabel(GameTimer.currentTime);
删除JLabel
只留下.-
timeLabel = new JLabel(GameTimer.currentTime);
PS:正如@Overcraft Full of Eels所述,请记住你的实例变量应该是非静态的,除了常量(声明为final
的那些)。
答案 1 :(得分:2)
您通过在构造函数中重新声明同名变量 来隐藏timeLabel变量。这意味着您只初始化为构造函数声明的变量,而不是在类中定位和声明的变量。不要在构造函数中重新声明timeLabel,而是在类中只声明一次。
另请注意,此变量不应该是静态的,而不是长镜头。事实上,除了任何常量之外,所有静态变量都不应该是静态的,而应该是实例变量。
答案 2 :(得分:1)
您指定了static
类变量,因此您需要:
timeLabel = new JLabel(GameTimer.currentTime);
您需要这样做,因为留下JLabel
会创建另一个对象,而类成员未初始化。编译器应该警告这种情况。
BTW静态变量就像给定类的全局常量一样,你应该看看并确定你是否真的需要它。