Erro de null pointer exception após iniciar a thread

4 respostas
evj

Boa noite pessoal do GUJ!

Criei uma classe que implementa a “Runnable”. Esta classe cria e me retorna uma conexão com o banco de dados, no método “Run” esta toda a parte da conexão. Instanciei esta classe e na sequência tentei pegar a conexão que ela me retorna, porém, a conexão retornada é null. O mais curioso é que em debug retorna a conexão e na execução normal retorna a conexão nula. Alguém pode ajudar?
Obrigado.

Classe de conexão que implementa Runnable:

public class ConnectionFactoryParalelo implements Runnable {
	
	public Connection con;
	
	@Override
	public void run() {
		
            try {
				Class.forName("oracle.jdbc.OracleDriver");
			} catch (ClassNotFoundException e) {
				
				e.printStackTrace();
			}
			
                     
            try {
				con =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521/XE", "teste", "teste");
			} catch (SQLException e) {
				
				e.printStackTrace();
			} 
			System.out.println("Conectado ao banco.");
		
	}	
	
	public Connection getCon() {
		return con;
	}

    
}

Método que salva os dados no banco:

public void salvaContatoParalelo(Contato c) throws SQLException{
		
    	ConnectionFactoryParalelo cfp = new ConnectionFactoryParalelo();
    	Thread t = new Thread(cfp);
    	t.start();
    	Connection conec = cfp.getCon();
    	  
    	     	
    	String sql;
		sql = "INSERT INTO CONTATOS(ID, NOME, EMAIL, ENDERECO, DATANASCIMENTO) " +
				"VALUES(contatosteste.nextval, ?, ?, ?, ?)";
		
		//criando o prepared statement
		PreparedStatement stmt = conec.prepareStatement(sql);
		
		//seta os valores
		stmt.setString(1, c.getNome());
		stmt.setString(2, c.getEmail());
		stmt.setString(3, c.getEndereco());
		stmt.setDate(4, new Date(c.getDataNascimento().getTimeInMillis())); 
		
		
		//executa o sql
		stmt.execute();
		stmt.close();
		System.out.println("Contato salvo com sucesso.");	
		
	}




4 Respostas

wagnerfrancisco

Como você tá usando uma Thread, você não tem como garantir que o objeto con esteja inicializado quando o acessa na thread principal.

Por que você tá inicializando a conexão em outra thread?

gustavocoolt

Bom, nao sei se no oracle é diferente, mais no mysql quando o id é auto incrementavel ele nem entra no sql…

evj

Oi Wagner! Tudo bem? Estou inicializando a conexão em outra thread porque depois vou fazer um teste de performance com o jmeter. Usando a thread posso limitar o tempo por exemplo e simular erros fazendo muitas requisições para salvar no banco.

wagnerfrancisco

Tranquilo. :smiley:

Não conheço JMeter, mas você realmente não pode deixar o código desta maneira, a Thread executa numa linha separada, então você não pode garantir que o atributo con seja inicializado antes de utilizá-lo. Quem sabe você deveria executar estas manipulações do banco na própria Thread… não sei qual impacto isto teria para os testes que tu pretende realizar.

Criado 25 de agosto de 2012
Ultima resposta 25 de ago. de 2012
Respostas 4
Participantes 3