java - NPE 使用 GTK LAF 运行 Netbeans 时

标签 java properties gtk look-and-feel

最近,我在 netbeans 日志中得到了一个奇怪的堆栈跟踪(我将其添加到本文末尾)。我能够追踪到 LAF。当使用 GTK LAF 运行 Netbeans 时会发生此错误,但在 Metal 和使用 native Windows LAF 中运行良好。

PropertyChangeSupport 实例似乎为 NULL,因此在添加属性更改监听器时会抛出错误。这是我的自定义组件的缩写源:

public class EnterprisePicker extends javax.swing.JPanel implements ActionListener, KeyListener, ListSelectionListener, UnitContainer {

    private static final Logger logger = IdeUiUtil.initLogger(EnterprisePicker.class.getName());
    protected InfoPanelStyle infoPanelStyle = InfoPanelStyle.FULL;
    private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
    public static final String PROP_INFOPANELSTYLE = "infoPanelStyle";

    /** Creates the new component */
    public EnterprisePicker() {
        // [... snip ...]
    }

    // [ ... snip ... ]

    /**
     * Add PropertyChangeListener.
     *
     * @param listener
     */
    @Override
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    // [ ... snip ... ]

}

显然,我可以简单地使用 if (propertyChangeSupport == null) 来保护这些调用...但这不会破坏以后在应用程序中的属性吗?假设因为实例为 null 而不会附加任何监听器...?

堆栈跟踪

INFO [org.netbeans.modules.form.BeanSupport]: Cannot create default instance of: org.statec.ide.ui.components.EnterprisePicker
java.lang.NullPointerException
        at org.statec.ide.ui.components.EnterprisePicker.addPropertyChangeListener(EnterprisePicker.java:654)
        at javax.swing.plaf.synth.SynthPanelUI.installListeners(SynthPanelUI.java:49)
        at javax.swing.plaf.synth.SynthPanelUI.installUI(SynthPanelUI.java:38)
        at javax.swing.JComponent.setUI(JComponent.java:662)
        at javax.swing.JPanel.setUI(JPanel.java:136)
        at javax.swing.JPanel.updateUI(JPanel.java:109)
        at javax.swing.JPanel.<init>(JPanel.java:69)
        at javax.swing.JPanel.<init>(JPanel.java:92)
        at javax.swing.JPanel.<init>(JPanel.java:100)
        at org.statec.ide.ui.components.EnterprisePicker.<init>(EnterprisePicker.java:39)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
        at org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:168)
[catch] at org.netbeans.modules.form.BeanSupport.createBeanInstance(BeanSupport.java:83)
        at org.netbeans.modules.form.BeanSupport.getDefaultInstance(BeanSupport.java:109)
        at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:769)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:1007)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:527)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:299)
        at org.netbeans.modules.form.FormEditor$3.run(FormEditor.java:337)
        at org.netbeans.modules.form.FormLAF$2.run(FormLAF.java:293)
        at org.openide.util.Mutex.doEventAccess(Mutex.java:1361)
        at org.openide.util.Mutex.readAccess(Mutex.java:320)
        at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:276)
        at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:334)
        at org.netbeans.modules.form.FormEditor.loadFormDesigner(FormEditor.java:232)
        at org.netbeans.modules.form.FormDesigner.finishComponentShowing(FormDesigner.java:1932)
        at org.netbeans.modules.form.FormDesigner.access$1100(FormDesigner.java:107)
        at org.netbeans.modules.form.FormDesigner$PreLoadTask$1.run(FormDesigner.java:1897)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
        at java.awt.EventQueue.access$000(EventQueue.java:84)
        at java.awt.EventQueue$1.run(EventQueue.java:602)
        at java.awt.EventQueue$1.run(EventQueue.java:600)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
INFO
org.openide.ErrorManager$AnnException: msg
        at org.openide.ErrorManager$AnnException.findOrCreate(ErrorManager.java:866)
        at org.openide.ErrorManager$DelegatingErrorManager.annotate(ErrorManager.java:653)
        at org.netbeans.modules.form.GandalfPersistenceManager.annotateException(GandalfPersistenceManager.java:237)
        at org.netbeans.modules.form.GandalfPersistenceManager.annotateException(GandalfPersistenceManager.java:247)
        at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:865)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:1007)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:527)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:299)
        at org.netbeans.modules.form.FormEditor$3.run(FormEditor.java:337)
        at org.netbeans.modules.form.FormLAF$2.run(FormLAF.java:293)
        at org.openide.util.Mutex.doEventAccess(Mutex.java:1361)
        at org.openide.util.Mutex.readAccess(Mutex.java:320)
        at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:276)
        at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:334)
        at org.netbeans.modules.form.FormEditor.loadFormDesigner(FormEditor.java:232)
        at org.netbeans.modules.form.FormDesigner.finishComponentShowing(FormDesigner.java:1932)
        at org.netbeans.modules.form.FormDesigner.access$1100(FormDesigner.java:107)
        at org.netbeans.modules.form.FormDesigner$PreLoadTask$1.run(FormDesigner.java:1897)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
        at java.awt.EventQueue.access$000(EventQueue.java:84)
        at java.awt.EventQueue$1.run(EventQueue.java:602)
        at java.awt.EventQueue$1.run(EventQueue.java:600)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
msg
Caused: java.lang.NullPointerException
        at org.statec.ide.ui.components.EnterprisePicker.addPropertyChangeListener(EnterprisePicker.java:654)
        at javax.swing.plaf.synth.SynthPanelUI.installListeners(SynthPanelUI.java:49)
        at javax.swing.plaf.synth.SynthPanelUI.installUI(SynthPanelUI.java:38)
        at javax.swing.JComponent.setUI(JComponent.java:662)
        at javax.swing.JPanel.setUI(JPanel.java:136)
        at javax.swing.JPanel.updateUI(JPanel.java:109)
        at javax.swing.JPanel.<init>(JPanel.java:69)
        at javax.swing.JPanel.<init>(JPanel.java:92)
        at javax.swing.JPanel.<init>(JPanel.java:100)
        at org.statec.ide.ui.components.EnterprisePicker.<init>(EnterprisePicker.java:39)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at java.lang.Class.newInstance0(Class.java:355)
        at java.lang.Class.newInstance(Class.java:308)
        at org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:168)
        at org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:252)
        at org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:191)
        at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:851)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:1007)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:527)
        at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:299)
        at org.netbeans.modules.form.FormEditor$3.run(FormEditor.java:337)
        at org.netbeans.modules.form.FormLAF$2.run(FormLAF.java:293)
        at org.openide.util.Mutex.doEventAccess(Mutex.java:1361)
        at org.openide.util.Mutex.readAccess(Mutex.java:320)
        at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:276)
        at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:334)
[catch] at org.netbeans.modules.form.FormEditor.loadFormDesigner(FormEditor.java:232)
        at org.netbeans.modules.form.FormDesigner.finishComponentShowing(FormDesigner.java:1932)
        at org.netbeans.modules.form.FormDesigner.access$1100(FormDesigner.java:107)
        at org.netbeans.modules.form.FormDesigner$PreLoadTask$1.run(FormDesigner.java:1897)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
        at java.awt.EventQueue.access$000(EventQueue.java:84)
        at java.awt.EventQueue$1.run(EventQueue.java:602)
        at java.awt.EventQueue$1.run(EventQueue.java:600)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
        at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:148)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Error in loading component: [JDialog]->enterprisePicker1
Cannot create instance of org.statec.ide.ui.components.EnterprisePicker.
The component cannot be loaded.

供引用:

malbert@dredg:~/.netbeans/7.0/var/log$ java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Server VM (build 20.1-b02, mixed mode)

malbert@dredg:~/.netbeans/7.0/var/log$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

最佳答案

只是一个猜测,但问题可能是在某些父类(super class)的初始化过程中 addPropertyChangeListener(...)被调用(javax.swing.JPanel.<init> 可能是罪魁祸首),因此此调用发生在 propertyChangeSupport 之前已初始化。

实例字段的初始化顺序是:

  • 对象
  • 组件
  • 容器
  • J组件
  • J面板
  • 企业选择器

如果在 JPanel 的初始化期间addPropertyChangeListener(...)方法被调用,它实际上是 EnterprisePicker 的重写版本,但是 EnterprisePicker的字段还没有被初始化。

要解决此问题,您需要检查 null在该方法中并根据需要进行初始化(或调用 super.addPropertyChangeListener(...) 。是否需要您自己的实现(添加您自己的 PropertyChangeSupport )?

关于java - NPE 使用 GTK LAF 运行 Netbeans 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555533/

相关文章:

java - 如何连接两个不同的类

css - 带有 GTK+ 3.20 的所有带有 CSS 文件的 GtkTextView 的单字体

java - EJB 方法中的事务传播

java - 无法实例化应用程序 - 无法获取包信息

java - 可重复使用的列格式设置方法

tomcat - 如何外部化 "spring.config.location"?

java - 忽略事件分派(dispatch)线程如何让这个程序工作?

java - 如何在属性文件中转义等号

c - GtkListStore 添加(段错误)

c - 将结构传递给回调函数