在JFrame上获取NullpointerException setvisible(true)

时间:2014-02-26 05:49:53

标签: java swing nullpointerexception

当我尝试执行frame.setvisible(true);

时,我得到以下异常
java.lang.reflect.InvocationTargetException at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at
java.lang.reflect.Method.invoke(Unknown Source) at
com.myapp.GeneralEventProc.cmdProc(GeneralEventProc.java:43)
at tcl.lang.Parser.evalObjv(Parser.java:810) at
tcl.lang.Parser.eval2(Parser.java:1209) at
tcl.lang.Interp.eval(Interp.java:2042) at
tcl.lang.Interp.eval(Interp.java:2071) at
javaapps.JScriptProcessor.processCurrentScript(JScriptProcessor.java:389)
at
javaapps.JScriptProcessor.processQueuedScripts(JScriptProcessor.java:632)
at javaapps.JSPThread.run(JSPThread.java:43) Caused by:
java.lang.NullPointerException at
java.awt.FlowLayout.layoutContainer(Unknown Source) at
java.awt.Container.layout(Unknown Source) at
java.awt.Container.doLayout(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validateTree(Unknown Source) at
java.awt.Container.validate(Unknown Source) at
java.awt.Window.show(Unknown Source) at
java.awt.Component.show(Unknown Source) at
java.awt.Component.setVisible(Unknown Source) at
java.awt.Window.setVisible(Unknown Source) at
com.myapp.mylist.makeList(Unknown Source) at
com.myapp.mylist.show(MyList.java:144) 

源代码是:

public void makeList() {

    synchronized (initLock) {

        System.out.println(" locking... makeList");

        if (_myFrame != null) {
            initiateList();
            _myFrame .setVisible(true);
        } else {
            System.out.println("myframe is null");
        }

    }

}

private void initiateList() {

    _myFrame.getContentPane().setLayout(null);
    _myFrame.getContentPane().removeAll();
    _myapp.setBounds(0, 0, getWidth(), (int) (getHeight() * 0.90));
    _myFrame.getContentPane().add(_myapp);
    _myFrame.getContentPane().add(_myPanel);
    _myPanel.setBounds(0, (int) (getHeight() * 0.90), getWidth(), (int) (getHeight() * 0.10));
    _myFrame.validate();
    _myFrame.repaint();

}

在上面的代码中,有两种方法makeList()initiateList()

makeList()方法开始,我们在同步中检查initiateList()不为空后调用_myFrame方法。然后,当我执行_myFrame.setVisible(true);时,从方法返回后,NPE发生。

注意:此问题只发生一次且不可重现。

java层中是否有任何错误?

请帮我解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:1)

_mainFrame.getContentPane().setLayout(null);似乎是你问题的开始。

调用validate指示布局管理器它应该更新它控制下的组件的布局,所以我不确定你为什么要调用它或你希望实现的目标。

这是一个错误吗?这是值得商榷的。 Swing是围绕布局管理器的使用而设计的,所以期望布局管理器正在使用中,特别是当你调用一个旨在更新它的方法时...我会说,不,这不是一个bug ... < / p>