java.lang.NullPointerException |我的时钟不起作用

时间:2013-10-12 20:01:18

标签: java nullpointerexception

我的一个朋友和我必须用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;
    }
}

3 个答案:

答案 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静态变量就像给定类的全局常量一样,你应该看看并确定你是否真的需要它。