Problema com tabela de banco de dados

13 respostas
Jorgev

Pessoal, eu tou com uma tabela .dbf com dados e eu quero fazer um programa java pra pegar os dados dessa tabela e passar pra uma tabela do MySQL. O problema é que tem linhas nessa tabela .dbf que tem uma coluna que ta vazia e toda vez da erro quando chega nessa linha e para a transferência.

Erro:

java.lang.NullPointerException
	at Classes.ConexaoABC.main(ConexaoABC.java:122)

Eu tentei verificar se a String era nula, mas não resolve porque ele nao passa desse ponto, simplesmente para o programa.

Alguem tem alguma idéia do que pode ser?

Abraço.

13 Respostas

kaique

Cara, mostra o fonte do arquivo ConexaoABC.java, ou pelo menos trechos de código próximos da linha 122 que talvez alguém possa te ajudar…

[]'s.

Jorgev

Eu coloquei uma string pra pegar o resultado da consulta e imprimir, ai ele para de imprimir quando chega na primeira linha onde a coluna 5 está vazia. se eu colocar pra imprimir só as colunas que estao todas preenchidas deixando a 5 de fora ele imprime tudo.

O código é esse:

public static void main(String args[]) throws SQLException{
		ConexaoABC conex = new ConexaoABC();
		conex.consulta("SELECT MED_BARRA, LAB_NOM, MED_DES, MED_APR, MED_PRINCI, MED_PCO1, MED_PLA1 FROM tabela");
					
		try {
			while(conex.resultSet.next()){
				
				String result = "'"+conex.resultSet.getObject(1).toString()+"','"+conex.resultSet.getObject(2).toString()+"'" +
								",'"+conex.resultSet.getObject(3).toString()+"','"+conex.resultSet.getObject(4).toString()+"'," +
										"'"+conex.resultSet.getObject(5).toString()+"','"+conex.resultSet.getObject(6).toString()+"'" +
												",'"+conex.resultSet.getObject(7).toString()+"'";

				System.out.println(result);
			}//fim do while
	
		} catch (Exception e) {
			e.printStackTrace();
		}

o erro é na linha onde ele pega o conex.reusultSet.getObject(5).toString()

T

ora, getObject(5) deve estar retornando null. Não se esqueça que não é possível chamar método nenhum de um objeto null.

luistiagos

algum desses seus getObject(n) deve estar null… dai null.toString() == a um belo NullPointerException…

T

Em vez de “’” + conex.resultSet.getObject(5).toString() + “’”, que é muito nojento, escreva um método assim:

private String imprimirString(Object obj) {
    if (obj == null) return "null"; 
    else return "\'" + obj + "\'";
}

e use isto:

... "," + imprimirString (conex.resultSet.getObject (5)) + "," + ...
Jorgev

Poxa cara eu coloquei um getString(5) no lugar do getObject(5) e pronto não deu mais erro.

Obrigado a todos.

Abraço.

Jorgev

Galera, agora ta dando erro ao inserir no MySQL.

eu fiz assim:

public static void main(String args[]) throws SQLException{
		ClasseConexao cone = new ClasseConexao();
		
		ConexaoABC conex = new ConexaoABC();
		conex.consulta("SELECT MED_BARRA, LAB_NOM, MED_DES, MED_APR, MED_PRINCI, MED_PCO1, MED_PLA1 FROM tabela");
		
		List lista = new ArrayList();
		
		try {
			while(conex.resultSet.next()){
				
				
				
				String query = "INSERT INTO medicamentos(MED_BARRA, LAB_NOME, MED_DES, MED_APR, MED_PRINCI, MED_PCO, MED_PLA)" +
						"VALUES('"+conex.resultSet.getObject(1)+"','"+conex.resultSet.getObject(2)+"'" +
								",'"+conex.resultSet.getObject(3)+"','"+conex.resultSet.getObject(4)+"'," +
										"'"+conex.resultSet.getString(5)+"','"+conex.resultSet.getObject(6)+"'" +
												",'"+conex.resultSet.getObject(7)+"')";
			
				lista.add(query);
				
			}//fim do while
	
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		for( int i = 0; i <= lista.size(); i++){
						
			cone.execInsert(lista.get(i).toString());
		}
		
	}

e dá o seguinte erro:

java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'null','0.0','18.42')' at line 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2926)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:2972)
	at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
	at com.mysql.jdbc.Statement.executeUpdate(Statement.java:929)
	at Classes.ClasseConexao.execInsert(ClasseConexao.java:73)
	at Classes.ConexaoABC.main(ConexaoABC.java:141)
P

Olá

Dá uma debugada pra ver como tá sua query antes dela ser executada e posta aqui… porque o erro agora é de SQL, não de Java… pode ser algum problema com o campo ou com aspas…

Até+

Jorgev

Paulo_Amorim:
Olá

Dá uma debugada pra ver como tá sua query antes dela ser executada e posta aqui… porque o erro agora é de SQL, não de Java… pode ser algum problema com o campo ou com aspas…

Até+

Olha eu fui colocando System.out em todas as linhas e todas as colunas uma por vez pra ver se descobria o erro, e vi que o erro é que no bd que eu tou tentando tranferir tem palavras assim don’t, com aspas simples, ai da erro por causa das aspas que eu coloco ‘don’t’.

E agora o que que eu faço pra colocar a palavra com o apostrofo?

kaique

Cara, não sei a respeito do banco que você trabalha, mas se você substituir isso ’ por isso ‘’, no Oracle resolve.
Então, não sei se isso é uma prática ruim, mas se você fizer um replaceAll("’", “’’”), acho que resolve o seu problema. Testa aí e depois dá um toque…

[]'s.

Amanweb

Você deve utilizar PreparedStatement para evitar esses e outros erros de SQL Injection.

[]s

B

Oi pessoal, ressucitando um tópico aqui por que meu amigo Aman pediu.

É como o Aman disse, você deve utilizar o PreparedStatement para evitar alguns erros como: aspas simples no meio da sql, porém o erro de NullPointerException ocorrerá sempre que você tentar acessar um método ou parâmetro em runtime em uma variável de referência que não aponta para um objeto. Isso independente ou não de você usar PreparedStatement pode acontecer pois o ResultSet pode retornar nulo.

Não são erros de SQL Injection, são ataques de Injection e um dos tipos pode ser SQL. Isso acontece porque você esta montando as querys dinâmicamente, mesmo usando PreparedStatement você terá esses problemas sempre que usar a estratégia de construir suas querys dinamicamente. A regra é não construir querys dinamicamente e use o PreparedStatement para lhe ajudar nessa tarefa.

Abraço.

Amanweb

90 graus a direita…

boblast:
Oi pessoal, ressucitando um tópico aqui por que meu amigo Aman pediu.

É como o Aman disse, você deve utilizar o PreparedStatement para evitar alguns erros como: aspas simples no meio da sql, porém o erro de NullPointerException ocorrerá sempre que você tentar acessar um método ou parâmetro em runtime em uma variável de referência que não aponta para um objeto. Isso independente ou não de você usar PreparedStatement pode acontecer pois o ResultSet pode retornar nulo.

Não são erros de SQL Injection, são ataques de Injection e um dos tipos pode ser SQL. Isso acontece porque você esta montando as querys dinâmicamente, mesmo usando PreparedStatement você terá esses problemas sempre que usar a estratégia de construir suas querys dinamicamente. A regra é não construir querys dinamicamente e use o PreparedStatement para lhe ajudar nessa tarefa.

Abraço.

Criado 19 de fevereiro de 2008
Ultima resposta 8 de out. de 2010
Respostas 13
Participantes 7