Java-NullPointerException在开始时。Swing bug还是错误的实现?

Java-NullPointerException在开始时。Swing bug还是错误的实现?,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我正在为一家公司开发一个应用程序, 它以各种方式管理oracle数据库。 这个程序是用Java、NetBeans编写的,而且越来越大。 我不认为它写得很好,但我经常 回到旧的坏代码,并尝试将其作为 可读性和面向对象的,因为我可以 我注意到10次中有1次,当我开始 程序,我得到以下异常:(尽管 程序启动并正常运行,即使是在这些时间) 我假设它是一只摇摆虫。这可能是我实施过程中的一个问题吗? 为什么10次中就有1次发生,但并不总是如此? 我能做些什么来避免它吗?看起来UI给出了一个NullPoint

我正在为一家公司开发一个应用程序, 它以各种方式管理oracle数据库。 这个程序是用Java、NetBeans编写的,而且越来越大。 我不认为它写得很好,但我经常 回到旧的坏代码,并尝试将其作为 可读性和面向对象的,因为我可以

我注意到10次中有1次,当我开始 程序,我得到以下异常:(尽管 程序启动并正常运行,即使是在这些时间)

我假设它是一只摇摆虫。这可能是我实施过程中的一个问题吗? 为什么10次中就有1次发生,但并不总是如此?
我能做些什么来避免它吗?

看起来UI给出了一个NullPointerException,但它不仅仅是在那里和那里。UI使用的其他东西可能无法正常工作或类似的情况。您能在这里发布整个错误以及导致错误的代码片段吗?

看起来用户界面给出了NullPointerException,但它不只是在那里。UI使用的其他东西可能无法正常工作或类似的情况。你能把整个错误和导致错误的代码片段都贴在这里吗?

10分之一听起来可能是某个地方的竞争条件。正如@willcodejavaforfood提到的,您需要确保所有GUI更改(包括启动)都在事件调度线程(EDT)上完成


您可以使用
SwingUtilities.invokeAndWait
SwingUtilities.invokeLater
来确保代码在EDT上执行。

1/10听起来可能是某个竞争条件。正如@willcodejavaforfood提到的,您需要确保所有GUI更改(包括启动)都在事件调度线程(EDT)上完成


您可以使用
SwingUtilities.invokeAndWait
SwingUtilities.invokeLater
来确保代码在EDT上执行。

SynthDefaultLookup.java第27行中有:

public Object getDefault(JComponent c, ComponentUI ui, String key) {
    if (!(ui instanceof SynthUI)) {
        Object value = super.getDefault(c, ui, key);
        return value;
    }
    SynthContext context = ((SynthUI)ui).getContext(c);
    Object value = context.getStyle().get(context, key); // line 27
    context.dispose();
    return value;
}
。。。可能是组件UI的上下文?你有没有一些没有组件UI的特殊UI


(好吧,抱歉,这不是回答,但也不是评论)

SynthDefaultLookup.java第27行中有:

public Object getDefault(JComponent c, ComponentUI ui, String key) {
    if (!(ui instanceof SynthUI)) {
        Object value = super.getDefault(c, ui, key);
        return value;
    }
    SynthContext context = ((SynthUI)ui).getContext(c);
    Object value = context.getStyle().get(context, key); // line 27
    context.dispose();
    return value;
}
。。。可能是组件UI的上下文?你有没有一些没有组件UI的特殊UI


(好吧,抱歉,这不是答案,但也不是评论)

你在EDT上启动GUI了吗?@willcodejavaforfood:Good point。我认为,如果GUI操作在事件分派线程(如SWT)之外执行,Swing应该抛出异常。通过不抛出异常,他们正在为自己设置违反最小惊讶原则的行为@亚当·佩恩特不该对斯温怀有敌意。汤姆·霍丁:很好的观点——那将是最好的解决办法。我刚刚指出,让实现介于线程安全和线程敌对之间是另一个错误(在我看来)。您是否在EDT上启动GUI?@willcodejavaforfood:Good point。我认为,如果GUI操作在事件分派线程(如SWT)之外执行,Swing应该抛出异常。通过不抛出异常,他们正在为自己设置违反最小惊讶原则的行为@亚当·佩恩特不该对斯温怀有敌意。汤姆·霍丁:很好的观点——那将是最好的解决办法。我刚刚指出,让实现在线程安全和线程敌对之间保持一半是另一个错误(在我看来)。这似乎是对meSeems的合理回答,也似乎是对methe的合理回答错误是不可复制的。很抱歉,我没有保留整件东西,所以我没有。我运行了这个项目20次,但没有出现。又得到了。将其添加到原始消息中错误不可复制。很抱歉,我没有保留整件东西,所以我没有。我运行了这个项目20次,但没有出现。又得到了。在原始消息中添加了它