Em que parte é gerado exception?

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

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).

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.

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

[code]public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
try {
getInstance();
} catch (RuntimeException e) {
JOptionPane.showMessageDialog(null, “faltando lib”);
}

		}
	});
}[/code]

coloquei no metodo initialize()

[code] 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”);
}

}[/code]

, 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…

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);
}

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

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.

[quote=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.
[/quote]
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:

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…

[quote=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…[/quote]
vlw thingol… funcionou blz para algumas libs…pro activation nao funfou mas ja ajuda…vlw mesmo…