Bom , minha dúvida é a seguinte, queria entender como posso tratar um exceção que é lançada dentro de um actionPerfomed, pois nao executo diretamente o metodo. Tipo vou mostrar o meu exemplo para ver se vocês entendem.
meu exemplo é esse
// Essa classe possui um botão de criar um album. Classe chamada JanelaAlbum
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jButtonCriar) {
try {
nome = jTextField.getText();
if (nome.equals(null) || nome.equals("")) {
throw new AlbumSemNomeException();
}
Album a = manipulador.crieAlbum(nome);
JOptionPane
.showMessageDialog(null, "Album criado com sucesso");
this.dispose();
PainelAlbum painelAlbum = new PainelAlbum(a, manipulador);
painelAlbum.mostrePainel();
} catch (AlbumJaExistente exception) {
JOptionPane.showMessageDialog(null,exception.getMessage());
exception.printStackTrace();
}
}
}
Porém se eu lançar essa exceção caso o nome do album seja nulo ou vazio, aonde poderei tratar? Pois eu nao chamo esse metodo em lugar algum, ele simplesmente é executado se o botão for clicado.
// Essa é classe JanelaPrincipal a qual instancia aquela janela, até tentei usar um try catch aqui mas como percebi o catch só captura se realmente o metodo tiver sido chamado
// porém eu nao chamo actionPerfomed aqui, e apenas executo ele na outra classe se o botão for clicado.
case CRIAR:
JanelaAbum sg = new JanelaAlbum(gerenciador);
sg.mostreJanela();
break;
Desde ja agradeço, valeu.
Fellipe,
A questão é que o Java utiliza inversão de controle para chamar o actionPerformed.
Vou explicar abaixo o mecanismo de inversão de controle que ocorre no evento do clique do botão:
1 - você deve criar uma classe que implemente a interface ActionListener e colocar no actionPerformed() o código que será executado quando ocorrer um evento no JButton (ou Button);
2 - Deve adicionar um objeto dessa classe ao seu JButton;
3 - Quando ocorrer um evento do JButton, a API do Java irá chamar internamente o método actionPerformed() do ActionListener que você associou ao JButton.
Então se você lançar uma Exception no actionPerformed() não haverá como você controlar o tratamento dessa Exception porque quem chama o actionPerformed() é a API do Java internamente.
Sugiro que você trate a condição que iria lançar a exceção dentro do próprio actionPerformed(). No if (nome.equals(null) || nome.equals("")), você pode por exemplo chamar um showMessageDialog() para alertar sobre o erro.
Ou se você criar uma outra classe que receba o atributo nome, essa classe poderia lançar a exceção que seria tratada no actionPerformed.
O link abaixo fala sobre esse assunto:
http://www.guj.com.br/java/197930-actionperformed
Muito obrigado pela explicação, entendi exatamente o que você quis dizer.
Pois realmente nao via como poderia ser trato uma exceção lançada no actionPerfomed, mas como você disse eu até ja sei onde irei tratar exceção, no metodo crieAlbum , na verdade lá eu ja lançava AlbumJaExistenteException, no caso irei adicionar mais uma exceção nesse método. Eu queria mais esclarecer mesmo esse negócio do ActionPerfomed nao ser chamado diretamente e nao poder lançar uma exceção nele.