2

我的一个朋友和我必须为大学编写一个 Java 游戏。我正在尝试在我们创建的工具栏中实现一个小时钟。当我运行代码时,会出现此错误:

GameTimer.run(GameTimer.java:29)的线程“Thread-0”java.lang.NullPointerException 中的异常

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

3 回答 3

3

您正在访问一个静态变量

KodeKsToolBar.timeLabel

KodeKsToolBar但是在构造函数中初始化一个同名的局部变量

JLabel timeLabel = new JLabel(GameTimer.currentTime);

删除JLabel就离开了。-

timeLabel = new JLabel(GameTimer.currentTime);

PS:正如@Overcraft Full of Eels 所说,请记住您的实例变量应该是非静态的,除了常量(声明为的那些final)。

于 2013-10-12T20:04:56.497 回答
2

您通过在构造函数中重新声明同名变量来隐藏 timeLabel 变量。这意味着您只初始化声明给构造函数的变量,而不是在类中定位和声明的变量。不要在构造函数中重新声明 timeLabel,而是在类中只声明一次。

还要注意,这个变量不应该静态的,而不是长期的。事实上,除了任何常量之外,所有的静态变量都不应该是静态的,而应该是实例变量。

于 2013-10-12T20:06:10.077 回答
1

您分配static类变量,因此您需要:

timeLabel = new JLabel(GameTimer.currentTime);

你需要这个,因为离开JLabel会创建另一个对象并且类成员没有被初始化。编译器应该警告这种情况。

顺便说一句,静态变量就像给定类的全局常量,你应该看看并确定你是否真的需要它。

于 2013-10-12T20:07:57.147 回答