在java中创建对象-stackoverflow错误
假设我有两个类A和B。如果我在类B中创建了类A的对象,并且在类A中创建了类B的对象,则会导致堆栈溢出错误。这个问题的一个解决方案是,我可以在类B的任何函数中创建一个类A的对象,反之亦然,但如果我这样做,那么每次调用创建类A的特定函数时,都会创建类A的对象 问题是我如何有效地将A和B类对象置于彼此内部 考虑下面的例子 客房类在java中创建对象-stackoverflow错误,java,Java,假设我有两个类A和B。如果我在类B中创建了类A的对象,并且在类A中创建了类B的对象,则会导致堆栈溢出错误。这个问题的一个解决方案是,我可以在类B的任何函数中创建一个类A的对象,反之亦然,但如果我这样做,那么每次调用创建类A的特定函数时,都会创建类A的对象 问题是我如何有效地将A和B类对象置于彼此内部 考虑下面的例子 客房类 public class Room { String roomno; String reserved; String category; S
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类
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类的对象,那么堆栈溢出错误不会显示,程序运行正常。不100%确定您的意思,您有这样的类吗
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
}
public class B {
private A a;
public void setA(A a) {
this.a = a;
}
}
你想创建一个“A”和一个“B”吗?例如
public class Factory {
public static A createA() {
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
return a;
}
}
这有帮助吗?不是100%确定你的意思,你有这样的课程吗
public class A {
private B b;
public void setB(B b) {
this.b = b;
}
}
public class B {
private A a;
public void setA(A a) {
this.a = a;
}
}
你想创建一个“A”和一个“B”吗?例如
public class Factory {
public static A createA() {
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
return a;
}
}
这有帮助吗?您正在处理循环引用/依赖项,这不是一个好主意 您需要实现的是回调,因此a可以从B调用方法,B可以通知a参见上图:
例子:
您正在处理循环引用/依赖项,这不是一个好主意 您需要实现的是回调,因此a可以从B调用方法,B可以通知a参见上图:
例子: 如何使A类和B类的对象有效地相互关联 ? 不建议在Java(或任何OOP语言)中执行此操作,因为它会创建循环依赖项 如果处理不当,将导致异常,如
StackOverflowerError
,或者在程序/应用程序运行时,在解析依赖项以创建对象时将出现异常(如果使用Spring,则异常将由IOC容器引发)
因此,即使您在管理时没有上述问题,在代码中创建Java类或包之间的循环依赖关系也不是一个好的做法,因为这将很难理解/维护,而且代码复杂度很高。这就是为什么有类似的代码质量工具可以帮助识别循环依赖关系,以便我们在开发过程中避免它们
你可以寻找关于同一主题的更多细节
如何使A类和B类的对象有效地相互关联
?
不建议在Java(或任何OOP语言)中执行此操作,因为它会创建循环依赖项
如果处理不当,将导致异常,如StackOverflowerError
,或者在程序/应用程序运行时,在解析依赖项以创建对象时将出现异常(如果使用Spring,则异常将由IOC容器引发)
因此,即使您在管理时没有上述问题,在代码中创建Java类或包之间的循环依赖关系也不是一个好的做法,因为这将很难理解/维护,而且代码复杂度很高。这就是为什么有类似的代码质量工具可以帮助识别循环依赖关系,以便我们在开发过程中避免它们
您可以查看同一主题的更多详细信息。您可能希望将现有实例传递给另一个类。您没有在这两个类中创建任何对象。使用该代码不会导致堆栈溢出。@Kayaman我发布了一个代码示例,该示例给出了堆栈溢出错误。您可能希望将现有实例传递给另一个类。您没有在这两个类中创建任何对象。使用该代码不会导致堆栈溢出。@Kayaman我发布了一个代码示例,该示例给出了堆栈溢出错误。我已编辑了我的问题。我希望它能帮助你理解我想问的问题。我已经编辑了我的问题。我希望它能帮助你理解我想问的问题。