AbstractJdbc2Statement.java e java.lang.NullPointerException

Olá Pessoal!!!

Estou desenvolvendo um programinha para capturar do Banco de Dados (postgreSQL) a data e o total de receitas por tipo (sus e particular) da farmacia onde sou o farmacêutico Responsável (isso mesmo!!! farmacêutico e programador java INICIANTE)!!! segue o código abaixo:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;


public class EstatisticaDeReceitas {
	
	final static String url = "jdbc:postgresql://192.168.0.2:5432/bancodedados";
	final static String user = "user";
	final static String senha = "senha";
	static String sql;
	static String opcao;
	static Scanner sc;

	public static void main(String[] args) {
		
		System.out.println("Estatistica de Receitas");
		System.out.println("1 - SUS");
		System.out.println("2 - Particular");
		System.out.println("3 - Total");
		
		sc= new Scanner(System.in);
		
		System.out.printf("Digite a Opção de Consulta: ");
		
		opcao = sc.nextLine();
		
		if(opcao =="1")
		sql = "select distinct(dat_emissao), count(flg_receita) from cadcvend where" +
				"dat_emissao beteween '2012-01-01' and '2012-01-31' and flg_receita='1' and flg_excluido is null" +
				"group by dat_emissao order by dat_emissao";
		
		else if(opcao =="2")
		sql = "select distinct(dat_emissao), count(flg_receita) from cadcvend where" +
		"dat_emissao beteween '2012-01-01' and '2012-01-31' and flg_receita='2' and flg_excluido is null" +
		"group by dat_emissao order by dat_emissao";
		
		else if(opcao =="3")
		sql = "select distinct(dat_emissao), count(flg_receita) from cadcvend where" +
				"dat_emissao beteween '2012-01-01' and '2012-01-31' and flg_receita is not null and flg_excluido is null" +
				"group by dat_emissao order by dat_emissao";
		
		else
			System.out.println("Opção Digitada Inválida");
		
		try {
			Class.forName("org.postgresql.Driver");
			Connection con = DriverManager.getConnection(url, user, senha);
			Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			ResultSet rs = stm.executeQuery(sql);
			
			if(rs.first()){

				System.out.println("Receitas SUS");
				System.out.println("Receitas Particulares");
				System.out.println("Total de Receitas");
				System.out.println("Data\tQuantidade");
				System.out.println(rs.getString("dat_emissao\tflg_receita"));
				
				
			}else{
				System.out.println("Não Foi possivel localizar os dados");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

}

porém, independente da opção digitada (1, 2 ou 3) ocorre o seguinte erro:

Estatistica de Receitas
1 - SUS
2 - Particular
3 - Total
Digite a Opção de Consulta: 1
[b]Opção Digitada Inválida[/b]
Exception in thread "main" java.lang.NullPointerException
	at org.postgresql.jdbc2.AbstractJdbc2Statement.replaceProcessing(AbstractJdbc2Statement.java:800)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:351)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:252)
	at EstatisticaDeReceitas.main(EstatisticaDeReceitas.java:53)

sendo que as mesmas consultas feitas diretamente no banco de dados retorna o que eu realmente quero, ou seja, as datas e o total de cada tipo de receita. Não sei se tem alguma coisa a ver com System.out.println(rs.getString("dat_emissao\tflg_receita")); onde utilizo o \t para tabular os resultados. Aguardo ansioso por uma solução para o meu problema.

Olá Pessoal!!!

consegui resolver o problema do “Opção Digitada Inválida” substituindo (opcao==“1”) por (opcao.equals(“1”)), Porém agora está dando outra mensagem de erro - org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a “between” (que por sinal estava escrito errado e já foi consertado). E como falei antes, no banco de dados a consulta retorna corretamente. Obrigado pela força!!!

Seja bem vindo ao melhor dos mundo! :slight_smile:

tente trocar a linha 52 por:

Statement stm = con.createStatement();  

Outra coisa, não use Statement, ele é mais lento e também inseguro. Use PreparedStatement :slight_smile:

http://www.jdbc-tutorial.com/jdbc-tutorials/prepared-statements-tutorial

[]'s

Olá boa tarde, sugiro vc da um

Para saber exatamente o que vc esta enviando para o banco!
Pegar o resultado deste sysop e executar no banco, provavelmente problema de apostrofos!

Eu já tenho cabelos brancos e também já estou ficando careca!!! rsrsrs Mas se continuar assim acho que vai piorar!!!

Tentei fazer o que o WRYEL sugeriu e deu erro (ResultSet is Foward_only) então retornei à sintaxe anterior.

A dica de Gianetti foi bem legal, pois assim pude ver qual sql estava sendo enviado para o banco, inclusive com os devidos erros de sintaxe.

Meu problema agora é outro. Modifiquei o código (conforme abaixo) para cada uma das opções.

				if (opcao.equals("1")){
				System.out.println("Receitas SUS");
				System.out.println("Data\t\t\tQuantidade");
				System.out.println("-----------------------------------------------------");
				System.out.println(rs.getString("dat_emissao")+"\t\t\t"+rs.getString("flg_receita"));

Porém quando executo o programa dá um novo erro

Estatistica de Receitas
1 - SUS
2 - Particular
3 - Total
Digite a Opção de Consulta: 1
select distinct(dat_emissao), count(flg_receita) from cadcvend where dat_emissao between '2012-01-01' and '2012-01-31' and flg_receita='1' and flg_excluido is null group by dat_emissao order by dat_emissao
Receitas SUS
Data			Quantidade
-----------------------------------------------------
org.postgresql.util.PSQLException: A nome da coluna flg_receita não foi encontrado neste ResultSet.
	at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2562)
	at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:2405)
	at EstatisticaDeReceitas.main(EstatisticaDeReceitas.java:64)

O que eu quero é concatenar os resultados do rs.getString(“dat_emissao”) com o rs.getString(“flg_receita”) utilizando para isso a tabulação (\t) para que os resultados sejam mostrados na forma de uma “tabela”.

Obrigado pela atenção!

Acredito que no seu select o:

faltou um alias

abraços.

Gianetti, Valeu pela dica. Na verdade quebrei minha cabeça a tarde toda, mas consegui!!! o select count(flg_receita) retorna um bigint, então fiz um setInt e o nome da coluna (apesar de no banco de dados ser flg_receita) na consulta passa a ser “count” e deu certo!!! Estou com mais cabelos brancos na cabeça, ao mesmo tempo que fiquei com menos cabelos!!! rsrsrs Acho até que deu “curto-circuito” nos meus neurônios. Obrigado pelas dicas.