由 class 声明 subclass 引起的 StackOverflowError?

StackOverflowError caused by class declaring subclass?

我正在开发一个使用 class 和一些子 class 的项目。当我声明 Database class 时,出现此错误:

Exception in thread "main" java.lang.WhosebugError
    at data.DatabaseConnectionHandler.<init>(DatabaseConnectionHandler.java:12)
    at data.Database.<init>(Database.java:18)

最后两行又重复了大约 10000 次。

Database 是我的 parent class 而 DatabaseConnectionHandler 是子 class。在Databaseclass中,我声明了一个DatabaseConnectionHandler的实例,我想这可能是原因,但我不知道为什么。

Database Class:

public class Database {

    protected static Connection connection = null;
    protected static Statement statement = null;
    protected static ResultSet resultSet = null;

    DatabaseConnectionHandler DBCH = new DatabaseConnectionHandler(); //Line 18
    Registration regis = new Registration();

    public Database() throws SQLException {

        DBCH.openConnection();

    }

DatabaseConnectionHandler Class:

public class DatabaseConnectionHandler extends Database {

    private final String URL = "jdbc:mysql://localhost:3306/foo_bar";
    private final String USERNAME = "foo";
    private final String PASSWORD = "bar";

    public DatabaseConnectionHandler() throws SQLException {} //line 12

    protected void openConnection() {

    try {

        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

        connectionStatus = true;

    } catch (SQLException | ClassNotFoundException exe) {

        System.out.println(exe);

        connectionStatus = false;

    }

}

是否 Database() 声明 DatabaseConnectionHandler() 导致此错误?如果是,我该如何解决?如果不是,是什么导致了问题,我该如何解决?

创建 Database 时,您还创建了 DatabaseConnectionHandler:

public class Database {

    //...
    DatabaseConnectionHandler DBCH = new DatabaseConnectionHandler();
    //...

}

DatabaseConnectionHandlerDatabase:

public class DatabaseConnectionHandler extends Database {

    //...

}

因此创建 Database 需要创建 Database。这是一个无限递归。

您有两个选择:

  1. 在创建 Database
  2. 时不要创建 DatabaseConnectionHandler
  3. 没有 DatabaseConnectionHandler 本身就是 Database