Создание таблицы Postgresql с использованием аннотаций Java

Я изучаю аннотации и то, как работает спящий режим, чтобы лучше понять его.

Я знаю, что мой код может быть не самого лучшего качества, и я исправлю его, когда смогу разрешить свое исключение, я продолжаю получать NullPointerException, но я не понимаю, почему, что я сделал не так?

Основное в этом классе предназначено только для поиска причины проблемы, у меня есть другой класс, который будет использовать этот, из другого моего класса я могу добавлять данные в свою таблицу, но мне нужно иметь возможность сгенерировать таблицу используя аннотации, и именно здесь я получаю свой NullPointerException, я не могу сгенерировать свою таблицу

Это мой StackTrace

Exception in thread "main" java.lang.RuntimeException: java.lang.NullPointerException
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.generateDatabase(DatabaseManager.java:84)
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.main(DatabaseManager.java:40)
Caused by: java.lang.NullPointerException
at psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor.DatabaseManager.generateDatabase(DatabaseManager.java:82)
... 1 more

Это мой код

package psybergate.grad2018.javafnds.javabasics.annotations.hw3.vendor;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

import psybergate.grad2018.javafnds.javabasics.annotations.hw3.annotations.DomainClass;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.annotations.DomainProperty;
import psybergate.grad2018.javafnds.javabasics.annotations.hw3.developer.Customer;

/**
* @since 26 Apr 2018
* @author christiaan.dotze
*/
public class DatabaseManager {

private String addField = "";

private Connection connect = null;

private Statement statement = null;

private String primaryKey = "";

private String tableName = "";

public static void main(String[] args) {
    DatabaseManager manager = new DatabaseManager();
    try {
        Customer cust = new Customer();
        cust.setCustomerNum("11");
        cust.setFirstName("John");
        cust.setLastName("Doe");
        cust.setAge(27);
        cust.setDateOfBirth(1991);

        manager.generateDatabase(cust);
    } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | SQLException ex) {
        throw new RuntimeException("An error occured", ex);
    }
}

public String getTableName(Object obj) {
    Annotation[] domainClassAnnotation = obj.getClass().getDeclaredAnnotations();
    for (Annotation annotation : domainClassAnnotation) {
        if (annotation instanceof DomainClass) {
            tableName = ((DomainClass) annotation).name();
        }
    }
    return tableName;
}

private String getDatabaseFields(Object obj) throws NoSuchFieldException, SecurityException {
    Field[] decladedFields = obj.getClass().getDeclaredFields();
    for (Field field : decladedFields) {
        Annotation[] annotations = field.getDeclaredAnnotations();
        for (Annotation annotation : annotations) {
            if (annotation instanceof DomainProperty) {
                DomainProperty myAnnotation = (DomainProperty) annotation;
                if (myAnnotation.primaryKey() == true) primaryKey = myAnnotation.name();
                if (myAnnotation.unique() == false) {
                    addField += myAnnotation.name() + " " + myAnnotation.dataType() + ",\n";
                } else {
                    addField += myAnnotation.name() + " " + myAnnotation.dataType() + " " + "NOT NULL" + ",\n";
                }
            }
        }
    }
    addField += "PRIMARY KEY(" + primaryKey + ")\n";
    return addField;
}

public void generateDatabase(Object obj)
        throws SQLException, ClassNotFoundException, NoSuchFieldException, SecurityException {
    createConnection();
    getTableName(obj);
    getDatabaseFields(obj);
    try {
        statement.executeUpdate("CREATE TABLE " + getTableName(obj) + "(\n" + getDatabaseFields(obj) + ")");
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

private void createConnection() throws ClassNotFoundException, SQLException {
    Class.forName("org.postgresql.Driver");
    connect = DriverManager.getConnection("jdbc:postgresql://localhost:5432/", "postgres", "1234");
}

public int add(Object obj, String data)
        throws NoSuchFieldException, SecurityException, SQLException, ClassNotFoundException {
    createConnection();
    statement = connect.createStatement();
    return statement.executeUpdate("INSERT INTO " + getTableName(obj) + " VALUES (" + data + ")");
}
}

Было бы полезно, если бы вы указали, где находятся соответствующие номера строк (DatabaseManager.java:84 и т. д.)

Viacheslav Shalamov 01.05.2018 12:23

Вы пытались устранить проблему? Просто выполните пошаговые инструкции с отладчиком в IDE, которую вы используете.

Viacheslav Shalamov 01.05.2018 12:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть "оператор" нулевого объекта в методе "generateDatabase". Поле 'statement' инициализируется в методе 'add', когда 'add' никогда не запускается.

Попробуй поставить

statement = connect.createStatement();

после

createConnection();

в методе generateDatabase.

Я не могу поверить, что пропустил это, теперь все решено, спасибо

Christiaan 01.05.2018 12:40

Другие вопросы по теме