2013-10-12 6 views
2

Друг мой, и я должен запрограммировать игру в java для университета. Я пытаюсь реализовать маленькие часы на нашей панели инструментов, которые мы создали. Когда я запускаю код, эта ошибка появляется:java.lang.NullPointerException | Мои часы не работают

Исключение в потоке java.lang.NullPointerException "Thread-0" в 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; 
    } 
} 
+1

Удалите код, не относящийся к вашей ошибке. – Prateek

+1

Какая строка 'GameTimer.java: 29'? – ssantos

+1

Вы инициализируете статическую '' timeLabel'' в конструкторе (что, кстати, не слишком много смысла). Когда NPE происходит, конструктор не был вызван явно. – qqilihq

ответ

3

Y ou're доступ к статической переменной

KodeKsToolBar.timeLabel 

но инициализирует локальную переменную с тем же именем в KodeKsToolBar конструктору

JLabel timeLabel = new JLabel(GameTimer.currentTime); 

Удалить JLabel оставить just.-

timeLabel = new JLabel(GameTimer.currentTime); 

PS: @Overcraft Full of Eels, помните, что ваши переменные экземпляра должны быть нестатическими, за исключением констант (те, которые объявлены как final).

+0

Что именно вы имеете в виду? Я только начинаю изучать java: P – tk4muffin

+0

@ tk4muffin, который вы создаете и инициализируете новую локальную переменную 'JLabel timeLabel' в конструкторе' KodeKsToolBar' вместо 'KodeKsToolBar.timeLabel'. – Pshemo

+0

@ssantos: Спасибо, сейчас работает!:) – tk4muffin

2

Вы затенение переменной timeLabel по повторно объявить переменную тем же имя в конструкторе. Это означает, что вы инициализируете только переменную, объявленную конструктору, но не ту, что указана в классе. Не повторно объявляйте timeLabel в конструкторе, а просто объявляйте его только один раз в классе.

Также обратите внимание, что эта переменная должна быть не быть статичной, а не длинным выстрелом. Фактически все ваши статические переменные, за исключением любых констант, не должны быть статическими, но должны быть переменными экземпляра.

1

Вы назначая static переменную класса, так что вам нужно:

timeLabel = new JLabel(GameTimer.currentTime); 

Вам это нужно, потому что уход JLabel создает другой объект и член класса не инициализируются. Компилятор должен предупредить о такой ситуации.

Статические переменные BTW похожи на глобальные константы для данного класса, вы должны взглянуть и определить, действительно ли вам это нужно.

+0

Не только он должен выглядеть, но и связанное с ним поле должно быть * не * статическим. –

Смежные вопросы