gpt4 book ai didi

java - 在java中创建对象 - stackoverflow错误

转载 作者:行者123 更新时间:2023-12-02 03:13:22 26 4
gpt4 key购买 nike

假设我有两个类AB。如果我在类 B 中创建类 A 的对象,并在类 A 中创建类 B 的对象,则会导致堆栈溢出错误。解决此问题的一种方法是,我可以在 B 类中的任何函数内创建一个 A 类的对象,反之亦然,但如果我这样做,则会创建 A 类的对象每次调用创建 A 类对象的特定函数时。

问题是如何有效地将 AB 类的对象相互内部?

考虑以下示例。

房间等级

public class Room {

String roomno;
String reserved;
String category;
String airconditioned;
String bedtype;
String rent;

Connection con;
PreparedStatement ps;
ResultSet rs;

AddRoom adr = new AddRoom();
RemoveRoom rr = new RemoveRoom();
UpdateRoom ur = new UpdateRoom();
// AllRooms alr = new AllRooms();

public Room()
{
roomno = "";
reserved = "";
category = "";
airconditioned = "";
bedtype = "";
rent = "";
make_connection();
}

public void make_connection()
{
try{
String driver = "net.ucanaccess.jdbc.UcanaccessDriver";
Class.forName(driver);
String login = "jdbc:ucanaccess://C:\\MsDatabase\\EmployeeDB.accdb";
con = DriverManager.getConnection(login);

}catch(Exception ex){ System.out.println(ex);}
}

public void add_room(AddRoom obj)
{
try{
adr = obj;
if("".equals(adr.get_jtextfield1().getText())||"".equals(adr.get_jtextfield2().getText())||
"".equals(adr.get_jtextfield3().getText())||"".equals(adr.get_jtextfield4().getText())||
"".equals(adr.get_jtextfield5().getText())||"".equals(adr.get_jtextfield6().getText()))
{
JOptionPane.showMessageDialog(null, "None of the fields can be left empty");
}
else
{
roomno = adr.get_jtextfield1().getText();
reserved = adr.get_jtextfield2().getText();
category = adr.get_jtextfield3().getText();
airconditioned = adr.get_jtextfield4().getText();
bedtype = adr.get_jtextfield5().getText();
rent = adr.get_jtextfield6().getText();

String sql = "INSERT INTO RoomInfo(RoomNumber,Reserved,RoomCategory,AirConditioned,BedType,RentPerDay)"
+ "VALUES(?,?,?,?,?,?)";

ps = con.prepareStatement(sql);

ps.setInt(1, new Integer(roomno));
ps.setString(2, reserved);
ps.setString(3, category);
ps.setString(4, airconditioned);
ps.setString(5, bedtype);
ps.setInt(6, new Integer(rent));
ps.executeUpdate();
JOptionPane.showMessageDialog(null, "Room Added Successfully");
}

}catch(Exception ex){
JOptionPane.showMessageDialog(null, "Input in Room Number and "
+ "Rent Per Day should be a number");
}
}

}

添加房间类

public class AddRoom extends javax.swing.JFrame {

Room objr = new Room();
public AddRoom() {
initComponents();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//Room objr = new Room();
objr.add_room(this);
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
AdminHome admh = new AdminHome();
admh.setVisible(true);
dispose();
}

/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new AddRoom().setVisible(true);
}
});
}

public JTextField get_jtextfield1()
{
return jTextField1;
}

public JTextField get_jtextfield2()
{
return jTextField2;
}

public JTextField get_jtextfield3()
{
return jTextField3;
}

public JTextField get_jtextfield4()
{
return jTextField4;
}

public JTextField get_jtextfield5()
{
return jTextField5;
}
public JTextField get_jtextfield6()
{
return jTextField6;
}

// Variables declaration - do not modify
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;
// End of variables declaration
}

请注意,我已经在 AddRoom 类中创建了 Room 类的对象,并且还在 Room 类中创建了 AddRoom 类的对象。现在,如果我这样做,则会出现堆栈溢出错误,但如果我在 AddRoom 类中的任何函数内创建 Room 类的对象,则不会显示堆栈溢出错误,并且程序运行正常。

最佳答案

How can I make objects of class A and B inside each other effectively ?

不建议在 Java(或任何 OOP 语言)中执行此操作,因为它会创建循环依赖项。

如果处理不当,它将导致诸如 StackOverflowError 之类的异常,或者在程序/应用程序运行时,在解析创建对象的依赖关系时会出现异常(异常将由 IOC 容器(如 Spring)抛出,如果您使用)。

因此,即使您的管理没有出现上述问题,在代码内的 Java 类或包之间创建循环依赖关系也根本不是一个好习惯,因为它会很难理解/维护,而且代码也很难理解/维护。复杂性变高。这就是存在像 FindBugs 这样的代码质量工具的原因。这有助于识别循环依赖关系,以便我们在开发过程中避免它们。

你可以看看here有关同一主题的更多详细信息。

关于java - 在java中创建对象 - stackoverflow错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40726741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com