Em que parte é gerado exception?

9 respostas
R

Pessoal, em que parte do codigo é gerado exception por falta de uma lib externa???

tipo, configuro o class-path: lib/my_lib.jar
porem o usuario apaga e quando o mesmo for executar o programa, levantar um JOptionPane avisando que esta faltando a tal lib??
no meu caso eu uso jakarta mail

9 Respostas

Z

A exceção é lançada quando se tenta usar a classe que está faltando. Uma solução é capturar a NoClassDefFoundException, que é a exceção lançada quando não se acha determinada classe (típico erro de jar não encontrado).

R

além de NoClassDefFoundException, tb tem ClassNotFoundException, mas não lembro a diferença em que um das duas é lançada e em que circunstâncias.

R
certo, mas onde, no codigo, eu poderia fazer isso? tentei fazer try catch em um monte de parte mas nao aparece a mensagem... coloquei no main
public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				try {
					getInstance();
				} catch (RuntimeException e) {
					JOptionPane.showMessageDialog(null, "faltando lib");
				}

			}
		});
	}
coloquei no metodo initialize()
private void initialize() {
                    try{  
		this.setFocusableWindowState(true);
		this.setSize(461, 522);
		this.setUndecorated(false);
		this.setTitle("Email Sender");
		this.setResizable(false);
		this.setContentPane(getJContentPane());
		this.setVisible(true);
		this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
		center();
}} catch (RuntimeException e) {
 					JOptionPane.showMessageDialog(null, "faltando lib");
 				}

	}
, tb tentei no getJContentPane(); porem em todos, qdo tento executar sem colocar a lib aparece a mensagem could not find the main class. Program will exit...
T

Dica: se você realmente acha que seu usuário é cabeça suficiente para rodar sua aplicação sem ter algum dos jars necessários, você precisa fazer o seguinte:

No seu programa principal, antes mesmo de apresentar qualquer tela, você tenta instanciar (usando Class.forName), para cada jar que você sabe que é necessário, uma classe presente nesse jar. Se por acaso você receber uma ClassNotFoundException, você já trata antes de tudo (antes mesmo de chamar seu frame principal).

Exemplo: digamos que você precise de activation.jar e mail.jar. Você sabe que uma classe que existe em activation.jar é javax.activation.DataHandler e uma classe que existe em mail.jar é javax.mail.Message.

Faça então algo parecido com:

try {
    Class.forName ("javax.activation.DataHandler", false, null);
} catch (ClassNotFoundException ex) {
     JOptionPane..... ("O arquivo activation.jar não está presente no CLASSPATH. Abortando..");
     System.exit (1);
}
try {
    Class.forName ("javax.mail.Message", false, null);
} catch (ClassNotFoundException ex) {
     JOptionPane..... ("O arquivo mail.jar não está presente no CLASSPATH. Abortando..");
     System.exit (1);
}
R

thingol, ja tou enchendo o saco ne :stuck_out_tongue:
bom, o que é e como e quando se usa esse formato Class?

sobre seu exemplo, funcionou, funcionou bem ate d+ :stuck_out_tongue:
minhas libs estao numa pasta lib e eu coloquei

try { Class.forName ("/lib/javax.activation.DataHandler", false, null); } catch (ClassNotFoundException ex) { JOptionPane.showMessageDialog(null,"O arquivo activation.jar não está presente no CLASSPATH. Abortando.."); System.exit (1); }
ai o programa sempre levanta a excessao mesmo a lib estando la

T

Class.forName pede um nome de classe, uai (como mostrei). Que mania é essa de mudar o exemplo? Não pus nenhum “lib” lá, e não é para pôr nenhum “/lib”. Se tiver dúvida, consulte o javadoc da classe java.lang.Class.

R

thingol:
Class.forName pede um nome de classe, uai (como mostrei). Que mania é essa de mudar o exemplo? Não pus nenhum “lib” lá, e não é para pôr nenhum “/lib”. Se tiver dúvida, consulte o javadoc da classe java.lang.Class.

eu mudei pq inicialmente, do jeito que vc psotou nao pegou tb…ai pensei que poderia ser por causa da pasta… mas ja fiz um monte de combinação tentando colocar inclusive o jar completo como activation.jar e nenhum caso ele passa do try :frowning:

T

Hum, o exemplo que dei tinha um furo, é para usar:

Class.forName ("javax.activation.DataHandler", false, Thread.currentThread().getContextClassLoader());

em vez de

Class.forName ("javax.activation.DataHandler", false, null);

Acho que li a página errada do manual de mágicas de Hogwarts…

R

thingol:
Hum, o exemplo que dei tinha um furo, é para usar:

Class.forName ("javax.activation.DataHandler", false, Thread.currentThread().getContextClassLoader());

em vez de

Class.forName ("javax.activation.DataHandler", false, null);

Acho que li a página errada do manual de mágicas de Hogwarts…


vlw thingol… funcionou blz para algumas libs…pro activation nao funfou mas ja ajuda…vlw mesmo…

Criado 10 de julho de 2007
Ultima resposta 10 de jul. de 2007
Respostas 9
Participantes 4