Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Exceções em Java - Revista easy Java Magazine 7
Criação, lançamento, captura e tratamento de exceções em Java. Criação de exceções como extensões da classe Exception e uso de blocos Try-Catch-Finally, bem como o lançamento de exceções através do comando Throw.
Você não gostou da qualidade deste conteúdo?
(opcional) Você gostaria de comentar o que não lhe agradou?
[Artigo disponível no Leitor Digital DevMedia. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Easy Java Magazine 7
Algumas linguagens de programação,
inclusive a linguagem Java, trazem mecanismos de controle e manipulação de falhas.
Elas permitem que o desenvolvedor crie códigos simples para lançar e tratar falhas
geradas em tempo de execução. Esses problemas podem ser, por exemplo, problemas
de hardware, recursos (arquivos, banco de dados) que não puderam ser
manipulados ou apresentaram algum problema durante o processo de utilização ou,
como também, antigos bugs conhecidos
por programadores do mundo todo. Pensando nisso, este artigo será responsável
por descrever e explicar todo o funcionamento dessa ferramenta tão poderosa
para controle de falhas na linguagem Java.
O
que é uma Exceção?
Exceções são problemas que ocorrem e
provocam a interrupção do fluxo normal do programa. Situações adversas e
diferentes do que o programa está esperando como resultado. Para tratar essas
situações, temos os manipuladores de exceções. A ideia é passar o fluxo de
controle, uma vez interrompido por uma exceção, para um código que será
responsável por manipular e procurar uma alternativa a um código que não pode
ser executado por completo. Por exemplo, um método para ser executado precisa
abrir um arquivo em disco e ler algumas informações. Por algum motivo, o método
não conseguiu abrir esse arquivo e não pode ser executado, assim o programa
para a execução, mas temos que ter uma saída e a saída é um manipulador de
exceção.
Problemática
Antes de mostrar o uso e
aplicabilidade de exceções, vamos exemplificar com um problema simples que
ocorre sistematicamente no desenvolvimento de software. Chamamos aqui de
Problema do Saldo Negativo. O problema consiste em não deixar com que um débito
em conta-corrente seja maior que o valor do saldo atual da conta. Caso o débito
seja realizado, o correntista ficará com o saldo negativo, mas ele não tem
cheque especial e com isso o sistema deve ser alertado de alguma forma. Na Listagem 1 pode ser visto um código que
possui o problema.
Listagem 1. Classe Conta e
método debitar().
public class Conta {
private String numero;
private double saldo;
...
public void debitar(double valor) {
saldo = saldo - valor;
}
}
O método debitar() faz o débito do valor passado
como parâmetro na variável saldo,
mas não faz nenhum tipo de alerta ou filtragem, isto é, o débito sempre ocorre.
Essa situação seria a primeira solução para o débito em conta corrente, sem
nenhum tipo verificação de valores. Vejamos agora, na Listagem 2, uma possível solução onde é utilizada uma condição.
Listagem 2. Solução 1 para o
método debitar().
public
class Conta {
private String numero;
"
Este é um post disponível para assinantes MVPou para quem possui Créditos DevMedia. Clique aqui para saber mais!
Thiago José Marques Moura
é professor efetivo do IFPB Campus João Pessoa, leciona disciplinas de desenvolvimento Web em Java, mestrado em Inteligência Artificial pela UFPE e possui as certificações SCJP 1.4 e SCWCD 5.
6 COMENTÁRIOS
Minha procedure
CREATE OR ALTER PROCEDURE SP_VALIDA_USUARIO (
PLOGIN DM_LOGIN,
PSENHA DM_SENHA )
AS
DECLARE VARIABLE vCOUNT DM_INTEIRO;
BEGIN
IF (NOT EXISTS(SELECT LOGIN FROM USUARIO WHERE LOWER(LOGIN) = LOWER(:PLOGIN))) THEN
exception e_login;
ELSE IF (NOT EXISTS (SELECT SENHA FROM USUARIO WHERE LOWER(LOGIN) = LOWER(:PLOGIN) and
LOWER(SENHA) = LOWER(:PSENHA)))THEN
exception e_senha;
END
------------------
MEU METODO CHAMANDO A PROCEDURE:
public void validaUsuarioLogin(String strLogin, String strSenha) {
String query = "{ call SP_VALIDA_USUARIO(?,?) }";
try {
executePrepered(query,strLogin,strSenha);
} catch (SQLException ex) {
Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
}
}
-----------------------
MEU CODIGO NO BOTÃO ACESSAR DO FORMULARIO
private void btnAcessarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
dao.validaUsuarioLogin(txtUsuario.getText(), txtSenha.getText());
setVisible(false);
new frmPrincipal().setVisible(true);
}
----------------------------
MEU STACK TRACE NO NETBEANS:
11/06/2011 12:37:40 treinamento.forms.frmLogin btnAcessarActionPerformed
GRAVE: null
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544517. exception 5
E_SENHA
Senha inexistente
At procedure 'SP_VALIDA_USUARIO' line: 17, col: 84
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:730)
at org.firebirdsql.jdbc.AbstractCallableStatement.internalExecute(AbstractCallableStatement.java:435)
at org.firebirdsql.jdbc.AbstractCallableStatement.executeUpdate(AbstractCallableStatement.java:341)
at treinamento.dao.GenericaDao.executePrepered(GenericaDao.java:72)
at treinamento.dao.UsuarioDao.validaUsuarioLogin(UsuarioDao.java:30)
at treinamento.forms.frmLogin.btnAcessarActionPerformed(frmLogin.java:165)
at treinamento.forms.frmLogin.access$000(frmLogin.java:23)
at treinamento.forms.frmLogin$1.actionPerformed(frmLogin.java:59)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6289)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6054)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4652)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4482)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:603)
at java.awt.EventQueue$1.run(EventQueue.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:617)
at java.awt.EventQueue$2.run(EventQueue.java:615)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Você pode dentro do método validaUsuarioLogin(), no catch(SQLException ex), colocar uma mensagem para o usuário aí dentro mesmo, abaixo da linha Logger.getLogger(), ou se preferir, crie uma nova exceção e lance-a logo abaixo da linha Logger.getLogger(), para isso, deve-se envolver com try catch a linha dao.validaUsuarioLogin() no método btnActionPerformed() e no catch, colocar a mensagem para o usuário.
Essa é minha camada Dao, não é o formulário.



