В чем разница при обращении к объекту другого класса

Так-с, есть 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("Таблица создана");
    } //создание таблицы
}

3 класс


Ответы (1 шт):

Автор решения: Вася Воронцов

В приведённом коде не видно, чтобы нужный экземпляр класса SqliteConnector передавался в CreateMethods.

Сейчас создаётся, но не используется полностью готовый экземпляр:

SqliteConnector sqliteConnector = new SqliteConnector();
sqliteConnector.openConnection();
sqliteConnector.createStatement();

И создаётся и используется "пустой" экземпляр в конструкторе CreateMethods:

sqliteConnector = new SqliteConnector();

Именно из "пустого" экземпляра Вы и пытаетесь вытянуть нулевой statementA:

sqliteConnector.statementA.executeUpdate(query);

Что бы сделал я:

  1. Не создавал бы экземпляр класса SqliteConnector в SqliteTest.
  2. В конструкторе CreateMethods создал бы полностью готовый (тот, что выполнил методы openConnection() и createStatement()) экземпляр класса SqliteConnector.
→ Ссылка