向JList添加项会导致java.lang.NullPointerException

时间:2015-07-10 19:08:36

标签: java netbeans jlist

我一直在我的代码中搜索一个问题超过4个小时,但是找不到它...问题是,我有一个带有一个JFrame的java类,我在其中放置了一个带有DefaultListModel的JList 。然后我有另一个java类,我尝试将项添加到DefaultListModel。问题是,一切正常,将添加项目放到DefaultListModel。关于这里有什么问题的任何想法?

主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());}
        }
    }

提前谢谢!

stacktrace:

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)

2 个答案:

答案 0 :(得分:1)

虽然VGR的回答(移动SCHEDULE_LIST_MODEL以便在首选项初始化时它不为空)确实解决了你的即时问题,但我认为你所遇到的问题仅仅是循环依赖问题的一个症状,这将使保持你的程序繁琐(因为你花了大约4个小时发现),并且只需在SCHEDULE_LIST_MODEL分配值的地方移动就是最佳的创可贴修复。

您的程序结构如下:LedPanelPlayer依赖于Preferences和Schedule,Preferences依赖于Schedule,而Schedule依赖于LedPanelPlayer。您遇到的循环依赖问题在于LedPanelPlayer和Schedule都是相互依赖的。计划需要LedPanelPlayer.addElement,并且LedPanelPlayer构建一个计划(并且可能在LedPanelPlayer的某些部分使用它,但是它没有发布,否则它只是闲逛并且无用)。

考虑完全从LedPanelPlayer中删除SCHEDULE_LIST_MODEL,并使其成为实际管理它的类的实例字段(Schedule)。然后将Schedule.getScheduleListModel()添加到Schedule中,这样任何需要处理Scheduling的东西都可以简单地引用它,并使updateList不是静态的并且引用ScheduleListModel的新主页。由于Preferences想要处理调度信息,因此在构造函数中需要一个调度实例。

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

答案 1 :(得分:0)

堆栈跟踪表示您正在调用首选项的load方法,但在问题的代码中,您只是调用new Preferences()。没有调用任何加载方法。无论如何,你的堆栈跟踪是由代码生成的,其init方法实际上调用了Preferences.load,后者又调用了Schedule.updateList,后者又调用了LedPanelPlayer.addElement。

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

在调用任何Preferences方法之前,将SCHEDULE_LIST_MODEL的分配移动到一行,您的问题就会消失。