Java 导致堆栈溢出的简单JDialog

Java 导致堆栈溢出的简单JDialog,java,swing,stack-overflow,Java,Swing,Stack Overflow,我正在用Netbeans编写一个可视化应用程序,突然发现需要一个对话框。我决定从Netbeans自动提供的AboutBox中复制代码部分,结果发现这两个部分都导致抛出错误 我似乎无法找到错误的根源,尽管这两个错误都是在对话框关闭时引起的 为了简单起见,因为我相信这两个bug都是相关的,下面是我的对话框。为了简洁起见,我省略了initComponents()和main(从未调用过)方法,但是defaultCloseOperation是DISPOSE\u ON\u CLOSE 当运行时,我得到一个堆

我正在用Netbeans编写一个可视化应用程序,突然发现需要一个对话框。我决定从Netbeans自动提供的
AboutBox
中复制代码部分,结果发现这两个部分都导致抛出错误

我似乎无法找到错误的根源,尽管这两个错误都是在对话框关闭时引起的

为了简单起见,因为我相信这两个bug都是相关的,下面是我的
对话框。为了简洁起见,我省略了
initComponents()
和main(从未调用过)方法,但是defaultCloseOperation是
DISPOSE\u ON\u CLOSE

当运行时,我得到一个堆栈溢出,我将在下面发布

public class AddRecipe extends javax.swing.JDialog {

/** Creates new form AddRecipe */
public AddRecipe(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
}

AddRecipe(java.awt.Frame parent) {
    super(parent);
    initComponents();

}

private void cancelButtonMouseClicked(java.awt.event.MouseEvent evt) {
    dispose();
}


// Variables declaration - do not modify
private javax.swing.JLabel Serves;
private javax.swing.JButton acceptButton;
private javax.swing.JButton cancelButton;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JList jList1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea jTextArea1;
private javax.swing.JTextField nameTextField;
private javax.swing.JTextField servesTextField;
private javax.swing.JTextField timeTextField;
// End of variables declaration

}
堆栈跟踪:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:262)
    at java.beans.Statement.invokeInternal(Statement.java:257)
    at java.beans.Statement.access$000(Statement.java:56)
    at java.beans.Statement$2.run(Statement.java:158)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.beans.Statement.invoke(Statement.java:154)
    at java.beans.Expression.getValue(Expression.java:115)
    at java.beans.Encoder.getValue(Encoder.java:105)
    at java.beans.Encoder.get(Encoder.java:225)
    at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:110)
    at java.beans.Encoder.writeObject(Encoder.java:74)
    at java.beans.XMLEncoder.writeObject(XMLEncoder.java:274)
    at java.beans.Encoder.writeExpression(Encoder.java:304)
    at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:389)
    at java.beans.DefaultPersistenceDelegate.doProperty(DefaultPersistenceDelegate.java:229)
    at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:264)
    at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:408)
    at java.beans.PersistenceDelegate.writeObject(PersistenceDelegate.java:116)
    at java.beans.Encoder.writeObject(Encoder.java:74)
    at java.beans.XMLEncoder.writeObject(XMLEncoder.java:274)
    at java.beans.Encoder.writeExpression(Encoder.java:304)
    at java.beans.XMLEncoder.writeExpression(XMLEncoder.java:389)
    at java.beans.DefaultPersistenceDelegate.doProperty(DefaultPersistenceDelegate.java:229)
    at java.beans.DefaultPersistenceDelegate.initBean(DefaultPersistenceDelegate.java:264)
    at java.beans.DefaultPersistenceDelegate.initialize(DefaultPersistenceDelegate.java:408)
(堆栈跟踪再重复几百次)

为了完整起见,下面是调用对话框的函数。同样,此代码是根据默认的Netbeans行为建模的(即使提供的AboutBox Netbeans会导致
java.lang.reflect.InvocationTargetException


正如Ashton K在评论中提到的,这个问题可以通过迁移到Oracle版本的JDK来解决。所以这个问题是运行至少他特定版本的OpenJDK的问题

为什么堆栈跟踪中有XML内容?您是否尝试过将这个简单的JDialog作为一个单独的小项目运行(不是大项目的一部分)?尝试过单独运行它,但没有成功。XML在项目的其他地方使用,但我不知道它是如何进入堆栈跟踪的。在接下来的几百行堆栈跟踪中,是否有类似于“at AddRecipe.newRecipeItem…”的内容?堆栈跟踪不包含对我的代码的引用,并且输出并不表示它正在截断堆栈跟踪。您应该有一个无参数构造函数,或者提供tsc文章中描述的自定义无意义构造函数。
xmlcoder
应该通过插入回引用来处理循环。但是,如果您有
get
met每次复制可变内部数据的hod将被视为新对象而不是反向引用(它使用
=
而不是
对象。equals
)。
private void newRecipeItemActionPerformed(java.awt.event.ActionEvent evt) {
    if (addRecipe == null) {
        JFrame mainFrame = RecipesApp.getApplication().getMainFrame();
        addRecipe = new AddRecipe(mainFrame);
        addRecipe.setLocationRelativeTo(mainFrame);
    }
    RecipesApp.getApplication().show(addRecipe);
}