Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida sobre exceção

Ao invocar um método de uma classe conta, por exemplo o deposita, no qual queremos tratar exceções relativas a valores inválidos passados como depósito(valores negativos), como no exemplo das video aulas, fazemos o tratamento com try/catch no método main que invoca deposita(), e também lançamos a exception no próprio corpo do método deposita, na classe conta. Porque precisamos lançar a exception no método deposita, se já estamos fazendo o try/catch no método main? Eu fiz um teste tirando o throw do método deposita, e o código apenas compila, porém a mensagem do catch no método main não é exibida.

3 respostas
solução!

Oi Thiago!

O try/catch no método main() apenas captura as exceções lançadas. O que aconteceu é que como você removeu o lançamento da exceção, o try/catch no main() está inútil.

Tente outra coisa: volte a lançar uma exceção no deposita() mas no main() capture no catch uma exceção de tipo diferente, por exemplo, uma NullPointerException. Depois adicione outro catch nomain() com o tipo de exceção que está sendo lançada no deposita(). Aqui vai o exemplo:

public class Conta {
  public static void main(String[] args) {
    Conta c = new Conta();
    try {
      c.deposita(-10.0);
    } catch (ArithmeticException ae) {
      System.out.println("Lancei exceção aritmetica: "+ae.getMessage());
    } catch (NullPointerException npe) {
      System.out.println("Lancei exceção de ponteiro vazio: "+npe.getMessage());
    }
  }
  public void deposita(double valor) {
    if (valor < 0.0) {
      throw new ArithmeticException("Valor não pode ser menor do que 0");
    }
    // resto do método deposita
  }
}

Putz, eu entendi agora Marco, iluminou aqui a cabeça. Eu estava com uma ideia errada, achando que o trabalho de capturar no main, e lançar no método era um trabalho redundante. Acho que o que me confundiu é que essa exceção fomos nós que lançamos por uma "regra de negócio" nossa, ou seja não pode haver depósito negativo. Quando eu não lanço a exceção no método, o compilador não reconhece nenhuma exceção e o código compila. Caso fosse uma exceção que ocorresse independente de regra de negócio, como a ArrayIndexOutOfBoundsException, seriam outros 500. Vou dar como solucionado, mas queria tirar só mais uma dúvida. Você não acha que seria melhor tratar estas exceções todas exclusivamente dentro do método, como no caso do deposita???

Genial hehehe

seriam outros 500

Então, no caso você está reduzindo a responsabilidade do método deposita(). Ele deve somente validar se o valor é acima de 0 e depositar. Aí, quem trata os casos de erro é o modelo de cima, no caso, o próprio método main(). Por exemplo, ele pode tentar avisar o usuário de que o depósito falhou. Pode tentar uma segunda vez utilizando um método diferente. Há várias opções.

Você poderia utilizar uma checked exception nesse caso pra deixar claro pra quem chamar o método deposita() que ele tem chance de lançar uma exceção. Aí o próprio compilador reconhece e dá erro de compilação caso não utilize o try/catch:

public void deposita(double valor) throws ArithmeticException {
  //implementa
}