Dúvida com throws

9 respostas
oitathi

Estou estudando Exceptions e estou com uma dúvida. Estou executando um método declarando throws e executando este mesmo método sem declarar throws, e o resultado, quando eu causa uma exceção é o mesmo.
Veja;

public static int quotient( int numerator, int denominator)//throws ArithmeticException
	{
		
		return numerator/denominator;
	}

Ora eu comento o throws e ora não

public static void main (String []args){
		
		Scanner scanner = new Scanner(System.in);
		int numerator;
		int denominator;
		int result;
		boolean continueLoop=true;
		do{
			try{
				System.out.print("Digite o numerador  ");
				numerator = scanner.nextInt();
				System.out.print("Digite o denominador  ");
				denominator = scanner.nextInt();
				result = quotient(numerator, denominator);
				System.out.println("O resultado eh: "+ result);
				continueLoop=false;
			}
			catch (InputMismatchException inputMismatchException) {
				scanner.nextLine();
				System.out.println();
				System.out.println(" Vc deve inserir numeros, tente novamente!");
				System.out.println();
			}
			catch(ArithmeticException arithmeticException){
				scanner.nextLine();
				System.out.println();
				System.out.println("Zero nao eh um denominador valido, tente novamente!");
				System.out.println();
			}
		}while (continueLoop);
	}

O resultado é sempre o mesmo (sem trows e com trows) as exceções são capturadas e tratadas… então pq é necessário o throws no método?

9 Respostas

Guilherme_Gomes

Dá uma olhada nas diferenças entre checked (que extendem Exception) e unchecked (que extendem RuntimeException) exceptions.
Daí vc vai entender melhor isso!

oitathi

Então cara, tô com o Deitel aqui, aliás, esse exemplo é do Deitel…Já reli o exemplo e a explicação do livro, mas mesmo assim não compreendi…

Guilherme_Gomes

Então coloca aí o texto do cara e o que vc não entendeu!

oitathi

Acho q fui bem clara no q não entendi. Se puder me ajudar grata, se quiser apenas pontuação, grata pela ajuda e passa a ficha pra outro.

nel

Oi,

existem exceções que são identificadas em tempo de compilação e outras em tempo de execução.
São exceções que podem ser tratadas. O compilador não vai lhe informar que o seu código vai lançar um NullPointerException, por exemplo. Entretanto, se eles estiver falho, em algum momento isso pode vir a ocorrer.

Quando a exceção deve ser tratada, como uma SQLException, por exemplo, quando utiliza um ResultSet, o método lança (throws) uma exceção e você deve trata-la, seja adicionando o throws no seu método ou usando o try-catch. Como você vai abordar isso? Na minha humilde opinião, cada caso é um caso.
É questão de analisar qual método deve ficar responsavél por tratar a devida exceção, pois, não vai querer que ela “estoure” na cara do usuário final, certo ? :slight_smile:

Você pode inclusive tratar a exceção e lançar ela com uma criada por você, algo como: AcessoBDException, quando ocorrer uma SQLException, entende?
Espero te-la ajudado.

oitathi

Obrigada pela resposta. Mas pelo o q entendi, eu devo usar ou o throws ou então o try catch?

Guilherme_Gomes

O throws é um aviso.
O try/catch serve pra capturar o erro.

Quando vc usa unchecked exceptions, o throws não é necessário, já que não é obrigatório captura-los.

E dá próxima vez, seja mais educada. Ninguém está aqui pra “ganhar pontos”.

nel
oitathi:
Obrigada pela resposta. Mas pelo o q entendi, eu devo usar ou o throws ou então o try catch?

Na realidade você pode fazer uso de ambos ou somente um.
O Sergio Taborda fez um artigo sobre exceções bem interessante, vale a pena ler.

Vou lhe dar um exemplo, muito básico e bem superficial, apenas para que entenda:

public interface Teste {
  void say(String s) throws Exception;
}

public class Concreta implements Teste {
   void say(String s) throws Exception {
        System.out.println(s);
   }
}

public class RealizaTeste {
   public static void main(String args[]) {
     Concreta c = new Concreta();
     c.say("Teste");
   }
}

Esse exemplo vai gerar erro em tempo de compilação. Porque? Porque o método "say" em sua assinatura lança uma exceção e eu não estou tratando ela.
Eu tenho duas opções para esse caso, ligo o "dane-se" e jogo a exceção para cima ou trato ela. Existe a terceira opção, que é tratar e ainda lançar a exceção, mas vou dar só os dois exemplos:

o "dane-se":

public class RealizaTeste {
   public static void main(String args[]) throws Exception {
     Concreta c = new Concreta();
     c.say("Teste");
   }
}

Veja, não fiz tratamento algum, apenas "repassei" a exceção (tens de ter certeza quando fizer isso). O ruim para esse caso é que vai estourar na cara do usuário a exceção. Bom, tratando ela:

public class RealizaTeste {
   public static void main(String args[]) {
     Concreta c = new Concreta();
     try {
         c.say("Teste");
     } catch (Exception e) {
        System.out.println("Desculpe, infelizmente tivemos uma exceção. " + e.getMessage());
        return;
     }
   }
}

É por ai o caminho :)

denisspitfire

opa… um ponto pro Guilherme Gomes. kkkk

Criado 7 de outubro de 2011
Ultima resposta 7 de out. de 2011
Respostas 9
Participantes 4