NullExeptionPointer em createStatement

3 respostas
androidjavamysql
zicky23

Boa tarde pessoa estou tendo dificuldades para encontrar a solução de um select em um MySQLexterno usando android, lib usada no android para conectar com MySQL:

mysql-connector-java-3.0.17-ga-bin.jar

segue os códigos para entendimento:

Iniciando a conexão:

private static final Conexao conect = new Conexao();

fazendo a arrayList

public ArrayList<MesesEntidade> getList() {
        try {
            
            st = conect.con.createStatement(); // AQUI ACONTECE O ERRO
            sql = "select id_funcionarios_2,nome_21 "
                    + "from Contracheques_8_2016 "
                    + "GROUP BY nome_21 "
                    + "LIMIT 10";
            rs = st.executeQuery(sql);
            list = new ArrayList<MesesEntidade>();
            while (rs.next()) {
                MesesEntidade p = new MesesEntidade();
                p.setIdMes(rs.getInt("id_funcionarios_2"));
                p.setDescricaoMes(rs.getString("nome_21"));
                list.add(p);
            }
        } catch (SQLException e) {
            conect.close();
            System.out.println("erro: " + e);
        }

arqui o código da conexão

@Override
    protected Object doInBackground(Object... params) {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://10.1.1.10:3306/dbmysql", "root", "root");  
            System.out.println("(OK) Conexão: " + con);
        } catch (ClassNotFoundException ex) {
            System.out.println("Não foi possível encontrar o Driver! " + ex);
        } catch (InstantiationException ex) {
            System.out.println(ex);
        } catch (IllegalAccessException ex) {
            System.out.println(ex);
        } catch (SQLException ex) {
            System.out.println("ERRO");
            System.err.println("exception: " + ex);
        }
        return con;
    }

a conexão parece estar ok, porém quando chega em CreateStatement(); acontece o NullExeptionPointer.

porque será?

SOLUÇÃO PARA ESTE PROBLEMA

a princípio tem que se criar dentro do doInBackground toda a conexão e o select.

@Override
    protected ArrayList doInBackground(String... params) {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection("jdbc:mysql://10.1.1.10:3306/dbmysql", "root", "root"); 
            System.out.println("Principal (OK) Conexão: " + con);

            Statement create = con.createStatement();
            ResultSet rs = create.executeQuery("select id_funcionarios_2,nome_21 "
                    + "from Contracheques_8_2016 "
                    + "GROUP BY nome_21 "
                    + "LIMIT 10");
            list = new ArrayList<MesesEntidade>();   // ATE AQUI TA BLZA REALIZA O ARRAY OK
            while (rs.next()) {
                MesesEntidade p = new MesesEntidade();
                p.setIdMes(rs.getInt("id_funcionarios_2"));
                p.setDescricaoMes(rs.getString("nome_21"));
                list.add(p);
            }
        } catch (ClassNotFoundException ex) {
            System.out.println("Não foi possível encontrar o Driver! " + ex);
        } catch (InstantiationException ex) {
            System.out.println(ex);
        } catch (IllegalAccessException ex) {
            System.out.println(ex);
        } catch (SQLException ex) {
            System.out.println(ERRO");
            System.err.println("exception: " + ex);
        }
        return list;
    }

3 Respostas

peczenyj

Vamos la

se o codigo que conecta no banco for assincrono, pode acontecer que vc tentou executar a sua query em um momento onde não existe a conexão ainda ( race-condition ) ou ela mesma não foi inicializada.

uma possivel solução é vc forçar a conexão antes de usar o atributo con.

4mega

também pode ser que sua prepared statement n esteja instanciada/inicializada

zicky23

Valeu Amigo, consegui resolver essa parte do APP colocando td dentro do doBackground, ou seja tem que criar uma thread separada para poder realizar a conexão, não pode ser na mesma thread do main. vou postar o código na pergunta. E vou abrir outro tópico em relação a passar esses dados recebidos em forma de ArrayList e passar para um ListView que não consegui até agora. Valeu

Criado 13 de setembro de 2016
Ultima resposta 14 de set. de 2016
Respostas 3
Participantes 3