Uso de throw

5 respostas
camarada_du

Olá a todos, sou iniciante em Java e no GUJ e gostaria da ajuda de vocês, desde já agradeço pela ajuda e peço desculpas por dúvidas sem sentido.
Vamos lá, eu testei o uso de throws, throw no seguinte código:

import java.util.Scanner;
public class Usando_throws_throw {

    public static void main(String args[])throws Exception{
    	int x=1;
    	Scanner ent = new Scanner(System.in);
    		System.out.print("Digite um número: ");
    		x = ent.nextInt();
    		if(x == 0)
    			throw new Exception("Digitou zero");
    		else	
    			System.out.printf("Digitou != de 0");	
    }
}

Se eu digitar zero ele lança a seguinte mensagem:
Exception in thread “main” java.lang.Exception: Digitou zero
at Usando_throws_throw.main(Usando_throws_throw.java:10)
Gostaria de saber se é normal aparecer além do conteúdo da mensagem que foi definida no lançamento da exceção a explicação da exceção ocorrida(parte em negrito da mensagem acima).

mais uma vez obrigado.

5 Respostas

robinsonbsilva

Boa tarde jovem!

Então, quando usamos “throws DAOException”, estao dizendo que : "Quem for usar deve tratar essa possivel exception

Veja abaixo, o método está “falando” quem me usar deve tratar o possivel erro de DAOException

public List selectAll() throws DAOException {

		List rows = new ArrayList();
		PreparedStatement stmt = null;
		ResultSet rs = null;
		StringBuffer sql = new StringBuffer("SELECT * FROM table");

		try {

			stmt = getConnection(getRequest()).prepareStatement(sql.toString());
			stmt.setObject(1, idCircuito);
			rs = stmt.executeQuery();         

			while (rs.next()) {
				int i = 1;
				CircuitoDTO dto = new CircuitoDTO();
				dto.setIdCircuito(rs.getInt(i++));
				dto.setIdPj(rs.getInt(i++));
				rows.add(dto);
				dto = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e.getMessage());
		} finally {
			ConnectionPool.closeAll(null, stmt, rs);
		}

		return rows;
	}

Agora uma chamada ao método:

public List selectAll() {
		try {
			return FactoryDAO.getCircuito(request).selectAll();
		} catch (DAOException e) {
			System.out.println(e.getMessage());
		}
	}

Ou seja, throws lança apenas a exception para quem usar tratar. No seu caso o método main deveria tratar a exception e não lança-lo, pois não há ninguem acima dele para tratar esse erro.

fabim

Respondendo a duvida do amigo, que nao era sobre responsabilidade de tratamento mas sim sobre a mensagem em si:

Essa mensagem aparece desse jeito provavelmente pq vc esta visualizando-a em alguma IDE. Se vc printa-la na tela, por exemplo, vera apenas
“java.lang.Exception: Digitou zero” no caso de e.toString(), ou apenas “Digitou zero” no caso de e.getMessage();

camarada_du

Obrigado por responder ao tópico, eu entendi o que vocês disseram, agora só para matar o resto da dúvida, por exemplo no uso de catch é possível definir uma mensagem para tratar o erro, exemplo:

catch(NumberFormatException e1){
        System.out.print("Não é um argumento inteiro");
}

sendo que não irá aparecer a descrição do erro porque ele foi tratado.
A dúvida é a seguinte, usando throw, além de exibir a mensagem definida de tratamento de exceção, ele exibe também a descrição dessa exceção?

Mais uma vez obrigado.

sergiotaborda

Sim é normal. Isso se chama Stacktrace (Rastro de Pilha).
Ele dá informação sobre onde foi lançada a exceção. É muito util para debug

camarada_du

Agora sim, sem mais dúvidas sobre throw, obrigado Sergio, Robinson, Fabim, valeu pela força.

Criado 3 de outubro de 2008
Ultima resposta 3 de out. de 2008
Respostas 5
Participantes 4