I do a program that through Java reads a file and put it into the database. I used different databases and with Cassandra it works. Then I tried to use Postgres but it gives me the error:
Exception in thread "main" java.lang.NullPointerException at PlantsDBPostgres.createStructure(PlantsDBPostgres.java:15) at Client.main(Client.java:37)
Why? Thank you below I enclose the code:
import java.io.IOException;
public interface DatabaseTesi {
public abstract void connection();
public abstract void createStructure() throws IOException;
public abstract void insertFile() throws IOException;
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public abstract class FileCSV {
private static String file;
protected String [] obj;
protected String line;
protected BufferedReader reader;
public FileCSV(String file) {
    super();
    FileCSV.file = file;
}
public FileCSV() {
    super();
}
public void readFile() throws IOException {
    reader = new BufferedReader(new FileReader(file));
    line = reader.readLine();
}
public abstract void readSingleObj();
}
public class FilePlants extends FileCSV {
protected String symbol;
protected String synonym_symbol;
protected String scientific_name;
protected String common_name;
protected String family;
public FilePlants(String file) {
    super(file);
    // TODO Auto-generated constructor stub
}   
public FilePlants() {
    super();
}
public void readSingleObj() {
    symbol = obj[0];
    synonym_symbol = obj[1];
    scientific_name = obj[2];
    common_name = obj[3];
    family = obj[4];                
}
}
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public abstract class DBPostgres implements DatabaseTesi{
protected FileCSV fs;
FileCSV getFs() {
    return fs;
}
void setFs(FileCSV fs) {
    this.fs = fs;
}
private PostgresType type = null;
public DBPostgres (PostgresType type) {
    this.type = type;
}
public PostgresType getType() {
    return type;
}
public void setType(PostgresType type) {
    this.type = type;
}
PreparedStatement st = null;
Connection connection = null;
public void connection() {
    try {
        Class.forName("org.postgresql.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        return;
    }
    System.out.println("PostgreSQL JDBC Driver registered");
    try {
        connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/dbplants", "postgres", "postgres");
    } catch (SQLException e) {
        System.out.println("Connection Failed");
        e.printStackTrace();
        return;
    }
    if (connection != null) {
        System.out.println("Connection successful");
    }else {
        System.out.println("Failed to make connection");
    }
}
public abstract void createStructure();
public abstract void insertFile() throws IOException;
}
import java.io.IOException;
import java.sql.SQLException;
public class PlantsDBPostgres extends DBPostgres{
PlantsDBPostgres() {
    super(PostgresType.PLANTS);
}
FilePlants fp = new FilePlants();
public void createStructure() {
    try {
        st = connection.prepareStatement("CREATE TABLE IF NOT EXISTS my_tab1 (symbol varchar(500), synonym_symbol varchar(500), scientific_name varchar(500), common_name varchar(500), family varchar(500))");
        st.executeUpdate();
    } catch(SQLException e) {
        System.out.println("Table already exist");
        e.printStackTrace();
        return;
    }
}
public void insertFile() throws IOException {
    try {
        fp.readFile();
        while (fp.line!=null) {
            fp.line = fp.reader.readLine();
            if (fp.line!=null && fp.line.length()>0) {
                fp.obj = fp.line.split(",");
                fp.readSingleObj();
                st = connection.prepareStatement("INSERT INTO my_tab1 (symbol, synonym_symbol, scientific_name, common_name, family) VALUES(?, ?, ?, ?, ?)");
                st.setString(1, fp.symbol);
                st.setString(2, fp.synonym_symbol);
                st.setString(3, fp.scientific_name);
                st.setString(4, fp.common_name);
                st.setString(5, fp.family);
                st.executeUpdate(); 
            }
        }
    }catch(SQLException e) {
        e.printStackTrace();
    }   
}
}
public enum PostgresType {
PLANTS;
}
public class DBPostgresFactory {
public static DBPostgres factory(PostgresType type) {
    DBPostgres dbpo = null;
    switch(type) {
    case PLANTS:
        dbpo = new PlantsDBPostgres();
        break;
    }
    return dbpo;
}
}
import java.io.IOException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
public class Client {
public static void main(String[] args) throws IOException {
    CommandLineParser parser = new DefaultParser();
    Options options = new Options();
    options.addOption("file1", true, "File piante");
    try {
        CommandLine commandLine = parser.parse(options, args);
        String path = commandLine.getOptionValue("file1");
        FileCSV inputFile = new FilePlants(path);
    DBPostgresFactory.factory(PostgresType.PLANTS).setFs(inputFile);
    }catch(ParseException e) {
        e.printStackTrace();
    }
    DBPostgresFactory.factory(PostgresType.PLANTS).connection();
    DBPostgresFactory.factory(PostgresType.PLANTS).createStructure();
    DBPostgresFactory.factory(PostgresType.PLANTS).insertFile();
    }
   }
 
    