2016-11-11 6 views
0

Я работаю над проектом, который использует класс и некоторые подклассы. Когда я заявляю о своем Database класс, я получаю эту ошибку:StackOverflowError, вызванный классом, объявляющим подкласс?

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

Эти две последние строки повторяются еще примерно 10000 раз.

Database является моим родительским классом, а DatabaseConnectionHandler является подклассом. В классе Database я объявляю экземпляр DatabaseConnectionHandler, я думаю, что это может быть причиной, но я не знаю, почему.

Database Класс:

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 Класс:

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() вызывает эту ошибку? Если да, то как я могу это исправить, а если нет, то почему возникает проблема и как это исправить?

+3

Каждая база данных создает DatabaseConnectionHandler, который также является базой данных, поэтому он также создает DatabaseConnectionHandler, который также является Dabase, поэтому он также создает DatabaseConnectionHandler, который также является Dabase, поэтому он также создает DatabaseConnectionHandler, который также является Dabase, поэтому он также создает DatabaseConnectionHandler, который также является Dabase, поэтому он также создает DatabaseConnectionHandler, который также является Dabase, поэтому он также создает DatabaseConnectionHandler, который также является Dabase ... См., где это идет? – azurefrog

+0

Я тоже так думал, но я не вижу никаких признаков DatabaseConnectionHandler, создающих базу данных в моем коде –

+1

@JvanAmerongen Что вы думаете: «DatabaseConnectionHandler DBCH = new DatabaseConnectionHandler();' делает, если не создает базу данных? – azurefrog

ответ

4

При создании Database, вы также создать DatabaseConnectionHandler:

public class Database { 

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

} 

И DatabaseConnectionHandler является Database:

public class DatabaseConnectionHandler extends Database { 

    //... 

} 

поэтому создание Database требует создания Database. Это бесконечная рекурсия.

У вас есть два варианта:

  1. Не создают DatabaseConnectionHandler при создании Database
  2. Не имеют DatabaseConnectionHandler сам быть Database
+0

Итак, когда создается DBCH (для краткости), он _also_ создает другую базу данных. Когда я создаю новую базу данных, она также создает DBCH? А как насчет создания методов в DBCH 'static', а не для создания DBCH? –

+2

@JvanAmerongen: «DatabaseConnectionHandler» не создает «базу данных», это * - это «база данных». – David