Oi gente, até dei uma olhada num tópico grande sobre isso, mas minha pergunta não foi respondida. É muito simples: porque no código abaixo, usar ou não o Throws não fez a menor diferença, o erro foi tratado do mesmo jeito?
package exemplos;
public class Throws {
public static void main(String[] args) {
int respostaDivisao = 0;
try {
respostaDivisao = obterDivisao (6,2);
}catch (ArithmeticException e){
System.out.println ("Divisão por zero");
}
System.out.println ("Resposta da divisão: " + respostaDivisao);
}
static int obterDivisao (int v1, int v2)throws ArithmeticException {
int r = 0;
r = v1/v2;
return r;
}
}
Por que ArithmeticException é uma RuntimeException. Ela não exige nem throws e nem catch.
Dê uma lida nesse tópico também: http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor
Oi Vini, obrigada por responder. Se vc deixar comentado só o throws, tudo certo, mas se vc comentar tb o try…catch ou ele e o throws e tentar dividir por zero, vai dar erro:
package exemplos;
public class Throws {
public static void main(String[] args) {
int respostaDivisao = 0;
//try {
respostaDivisao = obterDivisao (6,0);
//}catch (ArithmeticException e){
//System.out.println ("Divisão por zero");
//}
System.out.println ("Resposta da divisão: " + respostaDivisao);
}
static int obterDivisao (int v1, int v2)/*throws ArithmeticException*/ {
int r = 0;
r = v1/v2;
return r;
}
}
Erro:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exemplos.Throws.obterDivisao(Throws.java:17)
at exemplos.Throws.main(Throws.java:8)
Porque tanto faz você usar o throws ou não. É como acontece com NullPointerException (que também é uma RuntimeException): você nunca dá throws NullPointerException, mas ele sempre pode ocorrer quando você usa alguma variável nula.
Resumindo: usar ou não o throws pra RuntimeExceptions não faz diferença. Usar try e catch nelas faz.
Ah, tá ok Andre. Mas se for qualquer outro tipo de Exception (que não RuntimeExceptions) devo usar o Try…Catch e o Throws?
Ou try/catch ou throws…
Um irá anular o outro (a não ser que você coloque o throw no escopo do catch… Lógica lusitana…)
Funciona assim:
Você vai rodar um código que pode dar erro (como o de uma divisão, ou uma consulta a um banco).
Se esse código lançar uma Exception, ou filha de exception, mas não uma RuntimeException, você terá duas opções:
a) Capturar a exceção. Nesse caso, você é obrigada a colocar um try…catch.
b) Lançar a exceção para o método que te chamou: Nesse caso, você é obrigada a colocar um throws
Se for uma RuntimeException, as duas opções são quase as mesmas:
a) Capturar a exceção. Nesse caso, você é obrigada a colocar um try…catch.
b) Lançar a exceção para o método que te chamou: Nesse caso, você não faz nada.
Note que no b, no caso da RuntimeException, não é necessário escrever “throws”, ou tomar qualquer tipo de ação. Isso não significa que a exception não irá ocorrer. Ela ocorre, e sobe a pilha de execução como qualquer exception faz. Se escrever o throws, o Java também não considera um erro.