- Como posso gerar exceções em java?
- Por que quando uso determinada funções, o java obriga a usar um try catch.
- quando coloco o throws Exception no método, o que eu informo a ele? pois na prática eu num preciso usar o try catch
Dúvidas sobre tratamento de exceçõe
13 Respostas
throw new Exception(); // ou outra classe que extenda Exception, pode ser uma sua, personalizada
Só obriga quando você usa o “throws Exception” na assinatura do método, isso indica que o seu método pode retornar uma exceção, e o método que o utiliza deve tratá-lo de alguma maneira, pois o próprio método não saberia o que fazer…
Não entendi a pergunta. Ao declarar o 'throws Exception" voce obriga o método que o chama a utilizar um try/catch, ou repassar a Exception usando um “throws Exception” também…
Esse é o fluxo… você faz um método, e se ele conseguir tratar certas exceções, você as trata, senão, joga (throws) ela pra quem chamou, e este deverá ter um bloco try/catch pra capturar a Exception, ou jogar pra cima, e por ai vai…
- Como posso gerar exceções em java?
Exceções são objectos. Vc cria elas usando new.
Mas para a exceção “acontecer” ela precisa ser lançada. Vc usa throw para isso
throw new IllegalArgumentException();
Porque em java existem exceções verificadas, ou seja, o compilador verifica se vc está manipulando elas corretamente.
colocar o try-catch é uma das formas de vc manipular exceções.
- quando coloco o throws Exception no método, o que eu informo a ele? pois na prática eu num preciso usar o try catch
Esta eu não entendi bem. Quando vc coloca um throws Exception vc está dizendo que o método pode lançar uma Exception ou qq objecto da sua hierarquia.
Mais sobre exceptions que acho que mata suas duvidas:
Por exemplo
Estava fazendo um acesso a dados em JDBC.
O compilador só compilava o .java quando tratava as mesmas, com SqlExeception por exemplo.
Por que disso.
Por exemplo
Estava fazendo um acesso a dados em JDBC.O compilador só compilava o .java quando tratava as mesmas, com SqlExeception por exemplo.
Por que disso.
A exceção serve justamente para esses casos, imagine que você está escrevendo um código que roda num caixa eletronico, e que vai salvar uma transação bancária de um cliente, que quer fazer um depósito, e de repente o banco dá pau… o que você faz com a transação e o dinheiro que o cara colocou na máquina? Descarta e ignora a transação do cliente? Reza? Liga pro gerente? Engole a grana? Não, você trata a exceção, faz um rollback da transação, e informa pro cliente “Falha na transação”, devolvendo a grana…
Exemplo besta, mas deu pra entender… quando você “obriga” o tratamento da exceção com o “throws Exception” é porque algo muito sério pode acontecer, e por isso o Java não deixa você compilar… “opa, aqui vai lançar uma exceção, trate ela pois provavelmente você vai se ferrar se não tratar, e aí já não é problema meu”, diria o Java… 
mesmo eu não usando o throws Exception no método, ele me obriga igual, não?
pelo menos quando trabalho com Connection, Statement
mesmo eu não usando o throws Exception no método, ele me obriga igual, não?
pelo menos quando trabalho com Connection, Statement
Sim, pois são estes métodos que te obrigam á tratar a exceção… se voce quiser, pode “jogar ela pra cima”, usando o throws, e daí vai ser responsabilidade de quem chamou o seu método de tratar a exceção… ou seja, o Statement joga a exceção, você joga pra cima com o seu método, e quem chamou o seu método pode tratar ou continuar jogando pra cima também… lógico, uma hora alguem vai ter que tratar, não dá pra ficar jogando pra cima infinitamente, se ninguém tratar ela vai cair e derrubar todo mundo, efeito dominó…
então, sempre que informar o throws exception no método, quem consumir o mesmo precisa tratar as exceções?
E as classes Connection por exemplo tem o throws exception também no seu método getConnection possivelmente?
O mesmo acontence com o Statement
Sim, essa é a regra básica das exceções no Java…
E as classes Connection por exemplo tem o throws exception também no seu método getConnection possivelmente?
O mesmo acontence com o Statement
Sim, veja:
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/DriverManager.html#getConnection(java.lang.String,%20java.util.Properties)
public static Connection getConnection(String url, Properties info) throws SQLException // <- throws SQLException
Neste caso, a getConnection me obriga a tratar apenas a SqlExeception, e caso fosse mais de uma exceção, como isso ficaria declarado?
Agradeço pela sua grande ajuda marcelo
Neste caso, a getConnection me obriga a tratar apenas a SqlExeception, e caso fosse mais de uma exceção, como isso ficaria declarado?
Agradeço pela sua grande ajuda marcelo
Toda exceção deve, e extende, a classe Exception, ou seja, por polimorfismo podemos pegar qualquer exceção desse jeito:
try{
//blablabla...
}catch(Exception e){
//tratamento
}
Mas é claro que fica bem mais fácil quando sabemos qual exceção capturar/lançar.
No caso do getConnection, ele joga uma exceção do tipo SqlException, pois é óbvio que é um método que vai tentar acessar o seu banco, realizar as transações, entre outras coisas relacionadas ao banco de dados, logo, se ocorrer uma exceção, ela será do tipo SqlException…
Nada impede de você criar suas próprias exceções, ou lançar algumas específicas:
throw new Exception();
throw new RuntimeException();
throw new SqlException();
throw new NullPointerException();
throw new MinhaExcecaoPersonalizadaException();
//etc...
Se você quiser tratar alguma exceção de maneira específica, e o resto de maneira diferente, faça assim:
try{
metodoQueRetornaUmaSqlException();
metodoQueRetornaUmNumberFormatException();
metodoQueRetornaUmOutroExceptionQualquer();
}catch(SqlException e){
//tratar a SqlException
}catch(NumberFormatException e){
//trata a NumberFormatException
}catch(Exception e){
//tratamento 'generico'
}finally{
//algum codigo pra executar depois de tratar as exceções
}
Você pode declarar qual exceção deseja capturar, ou trata todas da mesma maneira, capturando o “Exception”, se não houver um catch específico para a exceção que deseja tratar, ela será capturada pelo bloco onde o tipo “Exception” é declarado.
tambem estou iniciando no poliformismo e exeçoes, e fico em duvida, quando usar ao certo, uma execeção.
Bem, exceções sempre serão lançadas, isso é fato… qualquer coisa pode ocorrer durante a execução de um programa, e quanto maior ele for, maior a chance de algo dar errado… um erro de formatação, um nullPointer, no caso dos bancos a conexão pode cair, etc etc…
Você usa elas pra “corrigir” erros inexperados (daí o nome “exceção”), e que podem causar sérios problemas na sua lógica, na sua aplicação… desde perda de dados, transações perdidas, queda da aplicação, etc etc… ou erros “esperados”, como numa transação de banco de dados, onde há grande chance de ocorrer um SqlException por algum motivo… sabendo disso, você cria blocos de try/catch e trata essas exceções da maneira adequada, dando rollback, ou outras coisas para assegurar a integridade dos dados e tudo o mais…
Quando criar exceções personalizadas, ai fica á seu critério, pois já existe um leque bem grande de exceções “padrão”, que geralmente cobrem quase todos os erros possíveis… mas óbviamente, cada aplicação é diferente, você pode criar a sua exceção para identificar um erro mais fácilmente, e poder tratar de maneira mais adequada o erro que aconteceu…
Obrigado, ja me deu uma “Luz” nas exeções.