Sobre Throws

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.