Throws

9 respostas
edymrex

Pra que server throws li no livro da deitel mas não entendi e fiz até esse exemplo:

public class Testes {
	
	
	public static int quociente(int x,int y)
	throws(e)
	{
		return x/y;
	}

	
	public static void main(String[] args) 
	{
		try
		{
			  int x=Integer.parseInt(JOptionPane.showInputDialog("Dígite o numerador"));
			  int y=Integer.parseInt(JOptionPane.showInputDialog("Dígite o denominador"));  
			   
			  System.out.print(quociente(x, y));
			
		}catch(Exception e)
		{
			JOptionPane.showMessageDialog(null,"Vc errou");
		}
	 
        
	}
	


}

Alguém sane…?

9 Respostas

NataliaOliveira

serve pra jogar alguma exceção se for capturada na execução do seu método.

:slight_smile:

maquiavelbona

Throws você deixa claro que você passará para frente uma Exception. Num bloco try/catch/finaly você trata o erro naquele momento, usando o throws você deixa para a instância acima tratá-lo.

Por exemplo:
public class TesteThrows {
	public static void main(String[] args) {
		System.out.println("Irei verificar o erro que ocorre em divisão por zero");
		geraErro(1,0);
		System.out.println("Terminou o programa");
	}
	private static int geraErro(int i, int j) {
		return i/j;
	}
}
Ele acusará a Exception no return de geraErro. Vamos agora tratar o erro:
public class TesteThrows2 {

	public static void main(String[] args) {
		System.out.println("Irei verificar o erro que ocorre em divisão por zero");
		try {
			geraErro(1, 0);
		} catch (ArithmeticException ex) {
			System.out.println("Tratei o erro no main");
		}
		System.out.println("Terminou o programa");
	}

	private static int geraErro(int i, int j) {
		int x;
		try {
			x=i/j;
		}catch(ArithmeticException e) {
			System.out.println("Tratei o erro em geraErro");
			return x;
		}
		return x;
		
	}
}
E verificarás que só aparecerá o tratamento em geraErro. Mas quando forças a instância acima:
public class TesteThrows3 {

	public static void main(String[] args) {
		System.out.println("Irei verificar o erro que ocorre em divisão por zero");
		try {
			geraErro(1, 0);
		} catch (ArithmeticException ex) {
			System.out.println("Tratei o erro no main");
		}
		System.out.println("Terminou o programa");
	}

	private static int geraErro(int i, int j) throws ArithmeticException{
		int x;
		x=i/j;
		return x;
		
	}
}
Você joga o tratamento de erro diretamente para o main().

Até!

maquiavelbona
Você também pode tratar o erro e mesmo assim encaminhar a mesma Exception ou outra. Vide exemplo:
public class TesteThrows4 {

	public static void main(String[] args) {
		System.out.println("Irei verificar o erro que ocorre em divisão por zero");
		try {
			geraErro(1, 0);
		} catch (ArithmeticException ex) {
			System.out.println("Tratei o erro do tipo ArithmeticException no main");
		}catch(IllegalArgumentException e) {
			System.out.println("Mas eu também posso receber o tipo IllegalArgumentException");
		}
		System.out.println("Terminou o programa");
	}

	private static int geraErro(int i, int j) throws IllegalArgumentException{
		int x;
		try {
			x=i/j;
		}catch(ArithmeticException e) {
			System.out.println("Tratei o erro no geraErro mas vou passar para frente com outro tipo");
			throw new IllegalArgumentException("Erro em argumento inválido, gera uma divisão por zero",e);
		}
		return x;
		
	}
}
Throws e bloco try/catch/finally tem que ser usados com critério, para não fazer com que os tratamentos de erro não sejam executados em momentos inoportunos.

Até!

edymrex

Obrigado

peerless

Tópico de JAVA BÁSICO

em tempo… eu não indicaria o uso de throws … pois de qualquer forma, uma hora a exceção terá de ser tratada. Então deixe os problemas já resolvidos no código reservado, utilizando o try/catch.

É apenas, a minha opinião.

a[]s

maquiavelbona

Tem vezes que a delegação de tratamento de erro não é propriedade do objeto mais próximo. Pode ser que queiras retornar a exceção para outro objeto tratar( ex.: um seletor de banco de dados, você pode tratar dos erros ali mesmo, mas pode ser que queiras receber a exceção que tal banco não funcionou e que isso seja tratado de uma forma diferente).
E tem vezes que mesmo que não ocorra uma exceção, você quer que ocorra(por exemplo em controle de acesso) para que isso seja tratado de uma maneira mais efetiva.

Até!

T

peerless:
Tópico de JAVA BÁSICO

em tempo… eu não indicaria o uso de throws … pois de qualquer forma, uma hora a exceção terá de ser tratada. Então deixe os problemas já resolvidos no código reservado, utilizando o try/catch.

É apenas, a minha opinião.

a[]s

Eu acho que é justamente o contrário - usar throws a maior parte do tempo, e resolver os problemas só quando necessário ou quando for pertinente.
Tentar resolver problemas em nível muito baixo pode acabar “escondendo” os problemas.

edymrex

Quando eu uso throws abaixo do método exemplo:

public static void imprime()
throws Exception

É pra chamar uma catch que está em outro método ? exemplo essa classe de teste que eu criei:

package com.testes;

import javax.swing.JOptionPane;
 

public class Testes
{
	
	
	  public static void main(String args[])
	  {
		  int x,y;
		  try
		  {
			  x=Integer.parseInt(JOptionPane.showInputDialog("Dígite o numerador "));
			  y=Integer.parseInt(JOptionPane.showInputDialog("Dígite o denominador "));
			  calcula(x, y);
		  }
		  catch(Exception e)
		  {
			  System.err.println("Tratando exceção do main");
		  }
		 
	  }
	  
	  public static void calcula(int x,int y)
	  throws Exception
	  {
		  try
		  {
			  
			   System.out.println("Dívisão "+x/y);
			   
			   throw new Exception();
		  }
		  
		  catch(ArithmeticException e)
		  {
			  System.out.println("Dívisão por zero");
		  }
		  catch(NumberFormatException e)
		  {
			  System.out.println("Vc digitou uma string ");
		  }
		  finally
		  {
			  System.out.println("Percorre todo o método e termina aki ");
		  }
		  
	  }
	
	
}

na parte throw new Exception(); ele lança uma nova exceção que está no corpo do main mais para que isto ocorrece tive que colocar no método calcula a expressão throws Exception com o nome da exceção que estou lançando, mas throws tb trata exceções do método mas não vejo sentido se vc chama o método dentro de um try catch é isto mesmo…?

maquiavelbona
Em geral. você lança uma exceção num catch, não num try, pois a intenção do try é percorrê-lo de uma maneira completa, e o do catch tratar a exceção, aí sim enviando uma exceção diferente. Modifiquei o seu código para que pudesse ver melhor como acontece. Aproveitei e criei uma Exception própria, que poderias usar para identificar tipos que sabes que pode acontecer, sem precisar recorrer as Exceptions padrão.
import javax.swing.JOptionPane;

public class Testes {

	public static void main(String args[]) {
		String x, y;
		try {
			x = JOptionPane.showInputDialog("Dígite o numerador ");
			y = JOptionPane.showInputDialog("Dígite o denominador ");
			calcula(x, y);
		} catch (Exception e) {
			System.out.println("Tratando exceção do main");
			e.printStackTrace();
		}
}

	public static void calcula(String x, String y) throws CalculoTesteException {
		try {
			System.out.println("Dívisão " + Integer.parseInt(x) / Integer.parseInt(y));
		} catch (ArithmeticException e) {
			System.out.println("Dívisão por zero");
			throw new CalculoTesteException("Erro por causa da divisão por zero", e);
		} catch (NumberFormatException e) {
			System.out.println("Vc digitou uma string ");
			throw new CalculoTesteException("Erro por causa de informação errada", e);
		} finally {
			System.out.println("Percorre todo o método e termina aki ");
		}
	}
}

class CalculoTesteException extends Exception {
	public CalculoTesteException(String string, Exception e) {
		super(string, e);
		System.out.println("Tipo da exceção: " + e.getClass());
	}
	public CalculoTesteException() {
		super();
	}
	public CalculoTesteException(String string) {
		super(string);
	}
}

Até!

Criado 10 de abril de 2007
Ultima resposta 10 de abr. de 2007
Respostas 9
Participantes 5