NullPointerException Problema [RESOLVIDO]

Olá pessoal!

Estou começando em Java e me deparei com o seguinte erro:

Exception in thread “main” java.lang.NullPointerException
at jdbc.dao.TccDAO.adiciona(TccDAO.java:27)

O trecho ao qual o erro se refere é esse:
[code]
String sql = “insert into contatos (autor,titulo,orientador,data) values (?,?,?,?)”;

	 try {
		PreparedStatement stmt = connection.prepareStatement(sql);
					
		
		// seta os valores
		stmt.setString(1,tcc.getNome());
		stmt.setString(2,tcc.getTitulo());
		stmt.setString(3,tcc.getOrientador());
		stmt.setDate(4, new Date( tcc.getData().getTimeInMillis() ));

         [/code]

Vi que tem bastante posts semelhantes no fórum, pesquisei mas não consegui encontrar o problema.

Se puderem me ajudar, eu agradeço!

Abraço!

Meu palpite vai para a variável connection! Indica aí para nós qual é a linha 27

Bom dia!!

Primeira coisa coloca um BreakPoint nessas linhas onde vc seta os valores, debuga e veja se algum desses parametros esta retornando null, veja se sua tabela aceita valores null, etc…

Att.

o erro ta na linha 27, como vc nao colocou o código fonte completo, o meu palpite é na linha:

Errado:

stmt.setString(1,tcc.getNome()); 
stmt.setString(2,tcc.getTitulo()); 
stmt.setString(3,tcc.getOrientador()); 
stmt.setDate(4, new Date( tcc.getData().getTimeInMillis() )); // Erro aqui

Correto

stmt.setString(0,tcc.getNome()); 
stmt.setString(1,tcc.getTitulo()); 
stmt.setString(2,tcc.getOrientador()); 
stmt.setDate(3, new Date( tcc.getData().getTimeInMillis() )); 

A ordem dos atributos sql começam apartir do 0 e não do 1, ai talvez o erro seja na no setDate pois nele vc cita o indice 4 que não existe pois deveria ser o número 3.

Enfim, é só um palpite e caso esteja errado, favor me corrigir :smiley:

A sua variável connection não está vazia?
Poste, de preferência, o erro todo e o seu código todo, pois só essas linhas fica meio vago arranjar solução.

[quote=caio.ribeiro.pereira]o erro ta na linha 27, como vc nao colocou o código fonte completo, o meu palpite é na linha:

Errado:

stmt.setString(1,tcc.getNome()); 
stmt.setString(2,tcc.getTitulo()); 
stmt.setString(3,tcc.getOrientador()); 
stmt.setDate(4, new Date( tcc.getData().getTimeInMillis() )); // Erro aqui

Correto

stmt.setString(0,tcc.getNome()); 
stmt.setString(1,tcc.getTitulo()); 
stmt.setString(2,tcc.getOrientador()); 
stmt.setDate(3, new Date( tcc.getData().getTimeInMillis() )); 

A ordem dos atributos sql começam apartir do 0 e não do 1, ai talvez o erro seja na no setDate pois nele vc cita o indice 4 que não existe pois deveria ser o número 3.

Enfim, é só um palpite e caso esteja errado, favor me corrigir :D[/quote]

Tem mais esse erro, mas, não seria uma NPE, ACHO que seria uma SQLException

[quote=caio.ribeiro.pereira]o erro ta na linha 27, como vc nao colocou o código fonte completo, o meu palpite é na linha:

Errado:

stmt.setString(1,tcc.getNome()); 
stmt.setString(2,tcc.getTitulo()); 
stmt.setString(3,tcc.getOrientador()); 
stmt.setDate(4, new Date( tcc.getData().getTimeInMillis() )); // Erro aqui

Correto

stmt.setString(0,tcc.getNome()); 
stmt.setString(1,tcc.getTitulo()); 
stmt.setString(2,tcc.getOrientador()); 
stmt.setDate(3, new Date( tcc.getData().getTimeInMillis() )); 

A ordem dos atributos sql começam apartir do 0 e não do 1, ai talvez o erro seja na no setDate pois nele vc cita o indice 4 que não existe pois deveria ser o número 3.

Enfim, é só um palpite e caso esteja errado, favor me corrigir :D[/quote]

Na verdade, o rapaz está certo, pois o PreparedStatement não começa do 0, e sim do 1.
O valor que consta não é como se fosse um vetor, e sim indicando a qual “?” o campo pertence.

Ou seja, aqui realmente está correto:

stmt.setString(1,tcc.getNome()); 
stmt.setString(2,tcc.getTitulo()); 
stmt.setString(3,tcc.getOrientador()); 
stmt.setDate(4, new Date( tcc.getData().getTimeInMillis() ));

O que eu posso suspeitar, sem ter o código do camarada:

  1. O objeto de conexão está nulo.
  2. Algumas das variáveis inseridas do Prepared Statement está NULL, e a tabela não aceita o campo null
  3. Só tenho dois palpites…

Nossa, a ajuda é rápida aqui hem…

O código completo da classe é:

package jdbc.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import jdbc.Connection.ConnectionFactory;
import jdbc.modelo.Tcc;

public class TccDAO {
	
	private Connection connection;
	
	public void TccDao(){
		this.connection = ConnectionFactory.getConnection();			
	}
	
	public void adiciona (Tcc tcc){

		// prepared statement para inserção
		String sql = "insert into contatos (autor,titulo,orientador,data) values (?,?,?,?)";
		
		try {
			// prepared statement para inserção
			PreparedStatement stmt = connection.prepareStatement(sql);
						
			
			// seta os valores
			stmt.setString(1,tcc.getNome());
			stmt.setString(2,tcc.getTitulo());
			stmt.setString(3,tcc.getOrientador());
			stmt.setDate(4, new Date( tcc.getData().getTimeInMillis() ));
		
			// executa
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}


	}
}

Vlw!

E o erro? Poste tb.

Coloque seu código entre as tags [“CODE”] e ["/CODE"] (retire as aspas), para melhor visualização no fórum.

Vlw.

Acho que DZR está correto. Realmente havia problema com a variável “connection”.

Esta estava assim: this.connection = ConnectionFactory.getConnection();

e deveria ser assim: this.connection = new ConnectionFactory().getConnection();

Mas mesmo assim o problema persiste.

O Erro:

Exception in thread “main” java.lang.NullPointerException
at jdbc.dao.TccDAO.adiciona(TccDAO.java:26)
at jdbc.teste.TestaInsere.main(TestaInsere.java:24)

A linha 24 apenas chama o método adiciona.

Bem, aqui está mostrando que o seu construtor não iniciou a variável connection.
Como não conheço todo o seu projeto, estou supondo que o jdbc é um pacote no seu projeto, e que o mesmo está acessível, ou seja, ele é public static.
Se o jdbc não for um pacote, sugiro criar uma classe estática para o ConnectionFactory.
Retire o atributo private do Connection (sei que não fará diferença alguma, mas comigo funcionou sem o private. Às vezes o peso do erro atrapalha)…
Retire o this.connection = ConnectionFactory.getConnection() e coloque-o antes da linha 26 (no caso, antes da linha PreparedStatement stmt = connection.prepareStatement(sql); ).
Se puder, debugue o projeto e veja se a variável connectio está sendo preenchida, pois pode estar com problema no ConnectionFactory, impedindo do drive JDBC conectar om o banco de dados. Aí, retorna um objeto vazio.

at jdbc.dao.TccDAO.adiciona(TccDAO.java:26)

Cara o que interessa é essa classe na linha 26, é aí que tá ocorrendo o erro!

Os parametros do PreparedStatement começam a contagem com 1 até onde eu sei…

http://download.oracle.com/javase/1.3/docs/api/java/sql/PreparedStatement.html

Creio eu que o erro seja aqui:

public void TccDao(){
    this.connection = ConnectionFactory.getConnection();
} 

não olhei o código completo com essa identação maluca que postou, mas não entendi o ‘void’, era pra ser um construtor?

public TccDao(){
    this.connection = ConnectionFactory.getConnection();
} 

Olhando seu código aqui com mais detalhes, o que o lucasportela falou no post acima tem sentido e es. Construtores não tem o parametro VOID, ou seja, você nunca está chamando o seu construtor. Consequentemente, a sua variável Connectoin nunca sai do NULL.
Faça a modificação sugerida por ele.

Vlw lucas pela sua idéia! Nem percebi o void ali…

AlanHoinacki posta o código inteiro dessa classe e entre as tags “ código-fonte ” para o pessoal aqui ajudar da melhor forma :smiley:

[quote=lucasportela]Creio eu que o erro seja aqui:

public void TccDao(){
    this.connection = ConnectionFactory.getConnection();
} 

não olhei o código completo com essa identação maluca que postou, mas não entendi o ‘void’, era pra ser um construtor?

public TccDao(){ this.connection = ConnectionFactory.getConnection(); } [/quote]

faça como o nosso amigo neste post falou que funciona…

como vc fez o metodo VOID ele nao vai ser executado até que vc mande executar o metodo… e por isso a sua variavel connection esta nula… esta e a causa do nullPointer Exception

o certo seria ser um construtor para ele executar na construção da classe… acredito que isto funcione mesmo!!

Oi Pessoal!!

Realmente a falha (feia) estava no método TccDao. Tornei-o construtor e o problema foi resolvido!

Agradeço a todos pela ajuda!

Obrigado!

BLZ!

Agora edite o seu primeiro tópico e coloque no título como [Resolvido].

Preciando, posta aí q a gente tenta lhe ajudar.