Diferenças entre execução em uma IDE e um .jar

Olá
Eu criei um sisteminha no JCreator que está funcionando bunitim, entaum resolvi criar um .jar desse sistema. O que está acontecendo é que quando eu executo .jar está dando um erro ( java.lang.NullPointerException ), que eu consegui isolar ele e descobri que acontece quando eu tento fazer um resultSet = statement.executeQuery( sql ).

Alguma idéia? Precisam do meu codigo?

Obrigado

newdevas,

  Aparentemente o seu objeto statement não foi criado. Mas seria uma boa você postar um trecho do código e a saída de erro gerada, aí dava pra ter uma visão melhor do problema.

[]'s Tone

São Paulo, 20 de julho de 2004.

 Como o Gladyston disse seu Statement não foi criado, ou se vc tiver usando um driver tipo Odbc o que pode ter acontecido é que o programa tenha perdido a fonte de dados quando vc criou JAR. Em todo caso seria melhor vc por o código aqui.

[code]public BancoDados()
{
try
{
Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);
conn = DriverManager.getConnection
(“jdbc:microsoft:sqlserver://SERVIDOR:1433;databaseName=GENLOG;User=sa;Password=”);

		stm = conn.createStatement();
	}
	catch( Exception e )
	{
		System.out.println( "Falhou: " + e );
	}
}

public void exportarArquivo( File file, String tipoUsuario, boolean imprimir )
{
	FileWriter writer;
	PrintWriter out;
	String sql;
	ResultSet rs = null;
	String sexo;
	int cont = 0;
	
	try{
		writer = new FileWriter( file );
		out = new PrintWriter( writer );
		
		if ( tipoUsuario.equals( "Aluno" ) )
		{
			out.println( "Matricula; Nome; Sexo; Curso; Turno; Turma; Login; Senha" );
			
			sql = "SELECT * from usuario WHERE tipo = '" + tipoUsuario +
			"' AND impresso = 'nao' AND situacao <> 'Cancelado'";
			
			rs = stm.executeQuery( sql );
			
			if( imprimir )
				atualizaImpresso( tipoUsuario );
									
			while( rs.next() )
			{
				cont++;
				if( rs.getString( "sexo" ).equals( "F" ) )
					sexo = "a";
				else 
					sexo = "o";
				out.print( rs.getString( "matricula" ) + ";" );
				out.print( rs.getString( "nome" ) + ";" );
				out.print( sexo + ";" );
				out.print( rs.getString( "curso" ) + ";" );
				out.print( rs.getString( "periodo" ) + ";" );
				out.print( rs.getString( "turma" ) + ";" );
				out.print( rs.getString( "login" ) + ";" );
				out.println( rs.getString( "senha" ) );
			}
		}
		if ( tipoUsuario.equals( "Professor" ) )
		{
			out.println( "Nome; Login; Senha" );
			sql = "SELECT * from usuario WHERE tipo = '" + tipoUsuario +
			"' AND impresso = 'nao' AND situacao <> 'Cancelado'";
			
			rs = stm.executeQuery( sql );
			
			if( imprimir )
				atualizaImpresso( tipoUsuario );
			
			/*while( rs.next() )
			{
				cont++;
				
				out.print( rs.getString( "nome" ) + ";" );
				out.print( rs.getString( "login" ) + ";" );
				out.println( rs.getString( "senha" ) );
			}*/
		}
		out.close();
		writer.close();
		JOptionPane.showMessageDialog( null, "Foram exportados " + 
		cont + " registros" );
		cont = 0;
	}catch( Exception e )
	{
		JOptionPane.showMessageDialog( null, "Falha no exportarArquivo(): " + e );
	}[/code]

Entaum, no final do codigo tem a linha

rs = stm.executeQuery( sql );

se eu comentar ela dae funciona o programa normal. o erro tah aparecendo justamente quando acontece o executeQuery. o que nao entendo eh q quando executo exatamente o mesmo codigo no jcreator ele funciona.

Sou iniciante na hitória, mas será q o problema não está na geração do .jar ?

Tem algo a ver com o Main-class ?

Acho que não com relação ao main-class senao acho q nem executaria o programa certo? ele tah funcionando, soh na hora q eu executo um evento que possui algum comando sql que dá a mensagem de erro.

Estou fazendo testes aqui e olha soh, quando eu coloco no manifest o .jar do driver do sqlserver dae dá um pipoco q quando eu clico nos menus nao tras mais as minha internal frames. dae se eu gero o .jar sem o class-path dae funciona normal as telas, mas na hora do sql lá da pau.

Mais pistas pra vcs ae, hehe. To achando q meu problema tah nesse driver do sqlserver no .jar será q nao eh isso?

São Paulo, 20 de juho de 2004.

    :shock: Dei uma olhada no seu código e não consegui achar a declação da classe Statement, algo como: 
    Statement stm = con.createStatement();
    Será que não é isso? Não se esqueça que este Statement deve estar disponével para toda classe, caso vc tenha declarado ela dentro de um outro método qualquer, tome cuidado com o modificador de acesso que vc usou...

Luiz Claudio F. dos Santos

O Statement tah declarado antes do construtor, malz ae, mas ele tá private. Todos os acessos ao banco são feitos através dessa classe. Como já disse antes, no JCreator funciona certinho mas no .jar… :cry:

newdevas,

    Posta o stack trace de erro. E verifica se o objeto statement é null, logo antes de usá-lo.
if(statement==null)
    System.out.print("eu sou null");

[]'s Tone

Bingooo, é isso mesmo. Olha só o erro "java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver. Eu nao tinha visto o erro antes porque eu coloquei no catch exception para trazer o erro via System.out.println… coisa de novato mesmo, hehe. Desculpa o transtorno pessoal, obrigado por todos que ajudaram.

Consegui fazer encontrar o driver acertando a criação do .jar, mas na minha aplicacao eu tenho as opcoes num JMenu na JFrame mas quando seleciono algum JMenuItem não está trazendo nada, deveria trazer uma internalframe… :frowning:

São Paulo, 21 de julho de 2004.

    Põe o cógido do JMenu e do JFrame pra a gente ver  :shock: 

Luiz Claudio F. dos Santos

Fiz varios testes aqui, descobri que o meu problema mesmo é na geração do .jar que quando executo ele não encontra o driver do sqlserver. To tentando fazer de varias formas diferentes meu manifesto mas não to conseguindo. Já olhei em documentações e até no forum aqui algo semelhante e não achei :cry: