Wyjątek NullPointerException

0

Witam, próbuję zmodyfikować wpis w bazie danych jednak, łapie mi wyjątek NullPointerException :/ Czy ma ktoś pomysł jak z z tym sb poradzic?

Poniżej kod oraz miejsca, w których jest łapany wyjątek wyjątek:

import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

abstract public class Query {

    protected String sql;
    protected Connection connection;
    private Statement statement;
    protected ResultSet resultSet;


    public Query(){
        this("");
    }
    public Query(String sql) {
        this.sql = sql;
    }


    public void execute() throws SQLException, ClassNotFoundException {
        execute(new HashMap<>());
    }
    public void execute(Map<String ,Object> context) throws SQLException, ClassNotFoundException {
        try {
            connectToDataBase();
            transformSQL(context);
            executeSQL();
            process(context);
            close();  ****-------------------------------------------------------------------------------WYJĄTEK------------------------------------------------------------------------------------------
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    protected void transformSQL(Map<String ,Object> context) { }


    private void connectToDataBase() throws ClassNotFoundException, SQLException {
        Class.forName("org.postgresql.Driver");

        //  "jdbc:postgresql://nazwahosta:port/
        //   nazwabazy","uzytkownik", "haslo"
        connection = DriverManager.getConnection(
                "jdbc:postgresql://localhost:5432" +
                        "/footballPlayers", "postgres", "postgres");
    }

    private void executeSQL() throws SQLException {

        statement = connection.createStatement();

        if(sql == null || sql.trim().equals(""))
        {
            return;
        }
        // wykonywanie SQL
        resultSet = statement.executeQuery(sql);
    }

    abstract protected void process(Map<String, Object> context) throws SQLException;

    private void close() throws SQLException {
        resultSet.close(); ****-------------------------------------------------------------------------WYJĄTEK---------------------------------------------------------------------------------------
        statement.close();
        connection.close();
    }
}
import KonkretnyPilkarz.EditPilkarz;

import java.sql.*;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;


public class AktualizujPilkarz extends Query {

    @Override
    protected void process(Map<String, Object> context) throws SQLException {
        EditPilkarz pilkarz = (EditPilkarz) context.get("pilkarz");

        PreparedStatement preparedStatement = connection.prepareStatement
                (
                "UPDATE pilkarz SET imie= ?, nazwisko= ?,waga= ?,wzrost= ?,data_urodzenia= ?,aktualna_cena= ?,\n" +
                        "Fk_kraj= ?,Fk_noga= ?,Fk_pozycja= ?,Fk_sponsor= ?,Fk_klub= ?\n" +
                        "WHERE id=?\n" +
                        "\n"
        );

        preparedStatement.setString(1,pilkarz.getImie());
        preparedStatement.setString(2,pilkarz.getNazwisko());
        preparedStatement.setString(3,pilkarz.getWaga());
        preparedStatement.setString(4,pilkarz.getWzrost());
        preparedStatement.setDate(5,pilkarz.getData_urodzenia());
        preparedStatement.setString(6, pilkarz.getAktualna_cena());
        preparedStatement.setInt(7, pilkarz.getFk_kraj());
        preparedStatement.setInt(8,pilkarz.getFk_noga());
        preparedStatement.setInt(9,pilkarz.getFk_pozycja());
        preparedStatement.setInt(10,pilkarz.getFk_sponsor());
        preparedStatement.setInt(11,pilkarz.getFk_klub());
        preparedStatement.setInt(12,pilkarz.getId());

        preparedStatement.execute();


    }
    public static void main(String [] args) throws  SQLException, ClassNotFoundException {
        AktualizujPilkarz aktualizujPilkarz = new AktualizujPilkarz();
        Map<String,Object> context = new HashMap<String, Object>();
        EditPilkarz pilkarz = new EditPilkarz(1,"Marco","Reus","73","185",
                new java.sql.Date(85,11,3),"76.980.000$",12,2,3,
                1,17);
        //System.out.println(pilkarz);
        context.put("pilkarz",pilkarz);
        aktualizujPilkarz.execute(context);**** -----------------------------------------WYJĄTEK----------------------------------------------------- 
    }
}

Bardzo proszę o pomoc,
pozdrawiam :)

2

Tworząc obiekt AktualizujPilkarz bez argumentów wywołujesz defaultowy, każdy defultowy konstruktor wywołuje defaultowy konstruktor klasy nadrzędnej czyli w tym przypadku Query. W defaultowym konstruktorze klasy Query ustawiasz this.sql na pusty String. Aplikacja dochodzi ci do tego momentu:

 if(sql == null || sql.trim().equals("")) 
  {
      return;
  } 

Wychodzisz z metody mając:

    protected ResultSet resultSet = null;

Następnie metoda close woła coś takiego:

null.close();

Nullptr gwarantowany. Co z tym możesz zrobić? rm -rf i
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

ewentualnie na necie znajdziesz przykład jak obsłużyć zamykanie zasobów poprawnie bez try with resources.

Poza tym masz leak zasobów bo otworzyłeś połączenie a nie możesz go zamknąć w obecnym kodzie. Wywal ten labirynt i napisz po ludzku bo to naprawdę jest syfiaste.

1 użytkowników online, w tym zalogowanych: 0, gości: 1