2015-07-10 96 views
0

我一直在寻找一个问题在我的代码超过4小时,但无法找到它......问题是,我有一个Java类与一个JFrame ,我已经把JList和DefaultListModel放在了一起。然后我有另一个Java类,我尝试添加项目到DefaultListModel。问题是,一切正常工作,将添加项添加到DefaultListModel。关于这里有什么问题的任何想法?添加项目到JList导致java.lang.NullPointerException

主要的Java类:

package ledpanelplayer; 

imports; //IMPORTS 

/** 
* 
* @author Dominik 
*/ 
public class LedPanelPlayer extends JFrame { 

    public static String RUN_PATH; 
    public static String LIB_PATH; 
    public static String PREFERENCES_FILE; 
    public static String LOG_FILE; 

    public static file_helper f; 
public static json_helper j; 
public static Player player; 
public static Preferences preferences; 
public static Schedule s; 
public static Console c; 

    public static JFrame WINDOW_FRAME; 
    public static int WINDOW_W; 
    public static int WINDOW_H; 
    public static String WINDOW_TITLE; 

    public static JList SCHEDULE_LIST; 
    public static DefaultListModel SCHEDULE_LIST_MODEL; 

    public static void main(String[] args) { 
     setLookAndFeel(); 
     setUIFont(new javax.swing.plaf.FontUIResource("Arial",Font.PLAIN,12)); 
     init(); //Init application 
    } 

    private static void setLookAndFeel() {} //Doesn't matter 
    public static void setUIFont (javax.swing.plaf.FontUIResource f){} //Doesn't matter 

    public static void init() { 
     RUN_PATH = new File("").getAbsolutePath()+"\\"; //Get local directory 
     LIB_PATH = RUN_PATH + "\\lib"; //Set libs directory 
     PREFERENCES_FILE = RUN_PATH + "\\preferences.lpp"; //Set preferences file path 
     LOG_FILE = RUN_PATH + "\\log.txt"; //Set log file path 

     f = new file_helper(); //Create new file_helper() 
    c = new Console(); //Create new Console() 
    c.init_files(); 
    j = new json_helper(); //Create new json_helper() 
    player = new Player(); //Create new Player() 
    preferences = new Preferences(); //Create new Preferences() 
    s = new Schedule(); //Create new Schedule() 

     WINDOW_FRAME = new JFrame(); //Create new JFrame() 
     WINDOW_W = 800; 
     WINDOW_H = 540; 
     WINDOW_TITLE = "Demo"; 

     WINDOW_FRAME.setSize(WINDOW_W,WINDOW_H); 
     WINDOW_FRAME.setLocationRelativeTo(null); 
     WINDOW_FRAME.setVisible(true); 
     WINDOW_FRAME.setTitle(WINDOW_TITLE); 
     WINDOW_FRAME.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     WINDOW_FRAME.getContentPane().setLayout(null); 
     WINDOW_FRAME.getContentPane().setBackground(new Color(237, 237, 237)); 
     WINDOW_FRAME.setResizable(false); 

     SCHEDULE_LIST_MODEL = new DefaultListModel(); 
     SCHEDULE_LIST = new JList(SCHEDULE_LIST_MODEL); //Create new JList() 
     SCHEDULE_LIST.setBounds(20, 20, 382, 444); 
     SCHEDULE_LIST.setBackground(new Color(226,226,226)); 
     //SCHEDULE_LIST_MODEL.addElement("<html><b>1.</b> Demo <p> duration: 10s | file: demo.mp4 | repeat: *36000</p></html>"); 
     WINDOW_FRAME.add(SCHEDULE_LIST); 
    } 

    public static void addElement(String e) { 
     SCHEDULE_LIST_MODEL.addElement(e); 
    } 
} 

其他类:

public static void updateList() { 
     for (int i = 0; i < SCHEDULE.size(); i++) { 
      try { 
       JSONObject object = (JSONObject)SCHEDULE.get(i); 
       String name = object.get("name").toString(); 
       String duration = object.get("duration").toString(); 
       String file = object.get("file").toString(); 
       String repeat = object.get("repeat").toString(); 
       LedPanelPlayer.addElement("<html><b>"+i+".</b> "+name+" <p> duration: "+(Integer.parseInt(duration)/1000)+"s | file: "+file+" | repeat: *"+repeat+"</p></html>"); 
      } 
      catch(Exception e) {e.printStackTrace();c.err("Schedule.updateList() : " + e.toString());} 
     } 
    } 

预先感谢您!

堆栈跟踪:

java.lang.NullPointerException 
    at ledpanelplayer.LedPanelPlayer.addElement(LedPanelPlayer.java:369) 
    at ledpanelplayer.Schedule.updateList(Schedule.java:69) 
    at ledpanelplayer.Preferences.load(Preferences.java:50) 
    at ledpanelplayer.LedPanelPlayer.init(LedPanelPlayer.java:142) 
    at ledpanelplayer.LedPanelPlayer.main(LedPanelPlayer.java:98) 
+3

异常的堆栈跟踪告诉你(和我们)问题在哪里。你会不会在你的问题中包含它? – VGR

+1

你的'LedPanelPlayer'定义在哪里? – Karthik

+0

如果这些字符串都已定义,那么'LedPanelPlayer'就是你的问题 – BoDidely

回答

1

虽然VGR的回答(在首选项初始化时移动SCHEDULE_LIST_MODEL以使其不为空)确实解决了你的问题,但我认为你所遇到的问题仅仅是循环依赖问题的一个症状,它会使你的程序单调乏味的(因为你花了大约4小时的时间才发现),而只是在SCHEDULE_LIST_MODEL赋值的地方移动,最好是一个创可贴的解决方案。

您的程序结构如下:LedPanelPlayer对首选项和计划具有依赖性,首选项对计划具有依赖性,并且计划对LedPanelPlayer具有依赖性。你所拥有的循环依赖问题在于LedPanelPlayer和Schedule都是相互依赖的函数。时间表需要LedPanelPlayer.addElement和LedPanelPlayer构造一个时间表(并且可能在未发布的LedPanelPlayer的某个部分中使用它,否则它只是四处闲逛而无用)。

考虑将SCHEDULE_LIST_MODEL完全从LedPanelPlayer中移出,并使其成为实际管理它的类的实例字段(Schedule)。然后将Schedule.getScheduleListModel()添加到Schedule中,以便需要处理Scheduling的任何内容都可以简单地引用它,并使updateList不是静态的并引用ScheduleListModel的新主目录。由于首选项需要处理调度信息,因此它的构造函数中需要一个调度实例。

通过这种方式,LedPanelPlayer将依赖于Preferences和Schedule,Preferences对Schedule具有依赖性,但是现在Schedule将不再依赖于LedPanelPlayer正常运行,不仅解决您的直接问题,而且解决根本原因你的代码更好读,理解和维护启动!)。

0

堆栈跟踪表明您调用预置的load方法,但在你的问题的代码,你只叫new Preferences()。没有调用任何加载方法。无论如何,你的堆栈跟踪是由代码生成的,该代码的init方法实际上调用Preferences.load,而Preferences.load又调用Schedule.updateList,后者又调用LedPanelPlayer.addElement。

问题是,所有这些都发生在SCHEDULE_LIST_MODEL被赋值之前。在Java中,默认情况下,所有对象字段都初始化为null,除非您将它们初始化为其他值。你不能在null上调用方法,这是你的异常的原因。

在调用任何首选项方法之前,将SCHEDULE_LIST_MODEL的赋值移至一行,并且问题应该消失。