В чем разница при обращении к объекту другого класса
Так-с, есть 3 класса.
- 1-ый
SqliteTest- для запуска - 2-ой
SqliteConnector- устанавливает соединение - 3-ий
CreateMetods- сборник методов
Я могу инициализировать SqliteConnector в классе SqliteTest, передать его экземпляр в метод из CreateMetods, и все будет работать. Но если я попытаюсь создать SqliteConnector в самом классе CreateMetods, то выдает ошибку NullPointerException.
С чем это связано, почему так принципиально создать объект в классе, где есть main? Или быть может я просто неправильно создаю?
Код, основное выделено "// Здесь"
SqliteTest:
import java.sql.*;
public class SqliteTest{
public static void main (String... args) throws SQLException{
SqliteConnector sqliteConnector = new SqliteConnector(); // Здесь
CreateMetods createMetods=new CreateMetods(); // Здесь
sqliteConnector.openConnection();
sqliteConnector.createStatement();
createMetods.createTable("name", "c0 int"); // Здесь
sqliteConnector.closeConnection();
System.out.println("End");
}
}
SqliteConnector:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
class SqliteConnector{
Connection connectorA;
Statement statementA; // Здесь
Statement getStatementA (){
return statementA;
}
void createStatement () throws SQLException{ // Здесь
statementA=connectorA.createStatement();
}
void openConnection (){
try{
Class.forName("org.sqlite.JDBC");
connectorA=DriverManager.getConnection("jdbc:sqlite:db\\A.db");
System.out.println("Connected");
} catch (Exception e){
System.out.println(e.getMessage());
}
}
void closeConnection (){
try{
connectorA.close();
} catch (Exception e){
System.out.println("");
}
}
}
CreateMetods:
import java.sql.SQLException;
import java.sql.Statement;
public class CreateMetods{
SqliteConnector sqliteConnector; // Здесь
CreateMetods (){ // Здесь
sqliteConnector = new SqliteConnector();
}
void createTable (String name, String column) throws SQLException{
String query="CREATE TABLE "+name+" ("+column+");";
sqliteConnector.statementA.executeUpdate(query); // Здесь
System.out.println("Таблица создана");
} //создание таблицы
}
Ответы (1 шт):
В приведённом коде не видно, чтобы нужный экземпляр класса SqliteConnector передавался в CreateMethods.
Сейчас создаётся, но не используется полностью готовый экземпляр:
SqliteConnector sqliteConnector = new SqliteConnector();
sqliteConnector.openConnection();
sqliteConnector.createStatement();
И создаётся и используется "пустой" экземпляр в конструкторе CreateMethods:
sqliteConnector = new SqliteConnector();
Именно из "пустого" экземпляра Вы и пытаетесь вытянуть нулевой statementA:
sqliteConnector.statementA.executeUpdate(query);
Что бы сделал я:
- Не создавал бы экземпляр класса
SqliteConnectorвSqliteTest. - В конструкторе
CreateMethodsсоздал бы полностью готовый (тот, что выполнил методыopenConnection()иcreateStatement()) экземпляр классаSqliteConnector.
