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

Exceções e controle de erros exercicio 12

import javax.management.RuntimeErrorException;

abstract class Conta {                                                                                                                           
//  private double saldo;
    protected double saldo;

    public double getSaldo() {
        return this.saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    public boolean saca(double valor_saque) throws Exception {
        if (this.saldo < valor_saque) {
            //return false;
            throw new SaldoInsuficienteException(saldo);
        }
        else {
            this.saldo = this.saldo - valor_saque;
            return true;
        }
    }

// public void deposita(double valor_dep) {//use este formato quando a classe filha de RuntimeException
     public void deposita(double valor_dep) throws ValorInvalidoException  {//use este formato quando a classe filha de Exception       
//     if (valor_dep > 0) {// neste formato utiliza a exeption do java  
//      this.saldo += valor_dep;
//     }
//     else  {
//         throw new IllegalArgumentException("Você tentou depositar" + " um valor negativo");
//     }
       if (valor_dep > 0) {// neste formato utiliza a exeption pelo programador
          this.saldo += valor_dep;
         }
         else  {
             throw new ValorInvalidoException(valor_dep);
         }       
    }      

   //public void atualiza(double taxa) {                                                                                                   
   //     this.saldo += (this.saldo * taxa);                                                                                                       
   // };       
    abstract public void atualiza(double taxa);    
} 



----

class ContaCorrente extends Conta implements Tributavel {
      public void atualiza(double taxa) {
             this.saldo += this.saldo * taxa * 2;
      }

    @Override
    public double calculaTributos() {
        return this.getSaldo() * 0.01;
    }
}
--
class ContaPoupanca extends Conta {

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 3;
   }

   public void deposita(double valor) {
        this.saldo += valor - 0.10;
   }

}
--
class TestaContas {
    public static void main(String[] args) {
//      Conta c = new Conta(); //este codigo não funciona porque a classe Conta passou a ser abstrata
        ContaCorrente cc = new ContaCorrente();
        ContaPoupanca cp = new ContaPoupanca();

//      c.deposita(1000); 
        //cc.deposita(1000); 
//      cp.deposita(1000);
//
        try {
            cc.deposita(-1000);
        } 
       // catch (IllegalArgumentException e) {// neste formato utiliza excption do java
        catch (ValorInvalidoException e) {            
          //System.out.println("Você tentou depositar um valor inválido na sua conta corrente");
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        try {
            cp.deposita(-1000);
        } 
        // catch (IllegalArgumentException e) {// neste formato utiliza excption do java
        catch (ValorInvalidoException e) {       
            //System.out.println("Você tentou depositar um valor inválido na sua conta poupança");
            System.out.println(e.getMessage()); 
        }

//        

//      c.atualiza(0.01);
        cc.atualiza(0.01);
        cp.atualiza(0.01);


//      
         try {
             cc.saca(10000);
             System.out.println("Saque Efetudado com sucesso");    
        } //catch (RuntimeException e) {pode ser assim
         catch (SaldoInsuficienteException e) { //ou assim -- usando a classe cariada por nós
             //System.out.println(cc.getSaldo() + " Saldo insufuciente");
              System.out.println(cc.getSaldo() + " Saldo insufuciente");
         }
         catch (Exception e) { //ou assim
            //System.out.println(cc.getSaldo() + " Saldo insufuciente");
             System.out.println("Ocorreu um erro indeterminado");
        }

//      System.out.println(c.getSaldo());
        System.out.println(cc.getSaldo());
        System.out.println(cp.getSaldo());

        System.out.printf("O saldo cc é: %.2f", cc.getSaldo());
        System.out.printf("O saldo cp é: %.2f", cp.getSaldo());
    }
}

Por que a classe TestaConta esta apresentando erro apenas no "catch" cp.deposita

try { cc.deposita(-1000); } // catch (IllegalArgumentException e) {// neste formato utiliza excption do java catch (ValorInvalidoException e) { //System.out.println("Você tentou depositar um valor inválido na sua conta corrente"); System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException }

try { cp.deposita(-1000); } // catch (IllegalArgumentException e) {// neste formato utiliza excption do java catch (ValorInvalidoException e) { //System.out.println("Você tentou depositar um valor inválido na sua conta poupança"); System.out.println(e.getMessage()); }

Unreachable catch block for ValorInvalidoException. This exception is never thrown from the try statement body

6 respostas

Opa, vc importou RuntimeException do pacote errado => import javax.management.RuntimeErrorException;

RuntimeException fica em java.lang, não precisa declarar a importação dela.

//import javax.management.RuntimeErrorException;

abstract class Conta {                                                                                                                           
//  private double saldo;
    protected double saldo;

    public double getSaldo() {
        return this.saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }

    public boolean saca(double valor_saque) throws Exception {
        if (this.saldo < valor_saque) {
            //return false;
            throw new SaldoInsuficienteException(saldo);
        }
        else {
            this.saldo = this.saldo - valor_saque;
            return true;
        }
    }

// public void deposita(double valor_dep) {//use este formato quando a classe filha de RuntimeException
     public void deposita(double valor_dep) throws ValorInvalidoException  {//use este formato quando a classe filha de Exception       
//     if (valor_dep > 0) {// neste formato utiliza a exeption do java  
//      this.saldo += valor_dep;
//     }
//     else  {
//         throw new IllegalArgumentException("Você tentou depositar" + " um valor negativo");
//     }
       if (valor_dep > 0) {// neste formato utiliza a exeption pelo programador
          this.saldo += valor_dep;
         }
         else  {
             throw new ValorInvalidoException(valor_dep);
         }       
    }      

   //public void atualiza(double taxa) {                                                                                                   
   //     this.saldo += (this.saldo * taxa);                                                                                                       
   // };       
    abstract public void atualiza(double taxa);    
} 
--
class ContaCorrente extends Conta implements Tributavel {
      public void atualiza(double taxa) {
             this.saldo += this.saldo * taxa * 2;
      }

    @Override
    public double calculaTributos() {
        return this.getSaldo() * 0.01;
    }
}

----
class TestaContas {
    public static void main(String[] args) {
//      Conta c = new Conta(); //este codigo não funciona porque a classe Conta passou a ser abstrata
        ContaCorrente cc = new ContaCorrente();
        ContaPoupanca cp = new ContaPoupanca();

//      c.deposita(1000); 
        //cc.deposita(1000); 
//      cp.deposita(1000);
//
        try {
            cc.deposita(-1000);
        } 
       // catch (IllegalArgumentException e) {// neste formato utiliza excption do java
        catch (ValorInvalidoException e) {            
          //System.out.println("Você tentou depositar um valor inválido na sua conta corrente");
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        try {
            cp.deposita(-2000);
        } 
        // catch (IllegalArgumentException e) {// neste formato utiliza excption do java
        catch (ValorInvalidoException e) {       
            //System.out.println("Você tentou depositar um valor inválido na sua conta poupança");
            System.out.println(e.getMessage()); 
        }

//        

//      c.atualiza(0.01);
        cc.atualiza(0.01);
        cp.atualiza(0.01);


//      
         try {
             cc.saca(10000);
             System.out.println("Saque Efetudado com sucesso");    
        } //catch (RuntimeException e) {pode ser assim
         catch (SaldoInsuficienteException e) { //ou assim -- usando a classe cariada por nós
             //System.out.println(cc.getSaldo() + " Saldo insufuciente");
              System.out.println(cc.getSaldo() + " Saldo insufuciente");
         }
         catch (Exception e) { //ou assim
            //System.out.println(cc.getSaldo() + " Saldo insufuciente");
             System.out.println("Ocorreu um erro indeterminado");
        }

//      System.out.println(c.getSaldo());
        System.out.println(cc.getSaldo());
        System.out.println(cp.getSaldo());

        System.out.printf("O saldo cc é: %.2f", cc.getSaldo());
        System.out.printf("O saldo cp é: %.2f", cp.getSaldo());
    }
}

Retirei a importação do pacote //import javax.management.RuntimeErrorException;

e o erro continua.

Fiz o seguinte Teste: a-) Deixando a classe "ContaPoupança" neste formato a classe "TestaContas" apresenta erro e não compila Unreachable catch block for ValorInvalidoException. This exception is never thrown from the try statement body

class ContaPoupanca extends Conta {

public void atualiza(double taxa) { this.saldo += this.saldo taxa 3; }

public void deposita(double valor) { this.saldo += valor - 0.10; }

}

b-) Se retirar da classe ContaPoupança, o método "deposita", a classe "TestaConta" não apresenta erro e compila, porém como vou cobrar a taxa por valor depositado ?? class ContaPoupanca extends Conta {

public void atualiza(double taxa) { this.saldo += this.saldo taxa 3; }

// public void deposita(double valor) { // this.saldo += valor - 0.10; // }

}

Até o momento não obtive resposta a este questionamento

Unreachable catch block for ValorInvalidoException Indica que tem um ponto do seu código tentando tratar essa exception, mas que ela nunca vai ser lançada. Minha sugestão é que vc vá exatamente na linha que ele reclama na compilação e tente seguir a ajuda do eclipse. Caso não dê certo, pega o trecho marcado pelo eclipse e coloca aqui, para te ajudarmos.

package br.com.caelum.fj11.programa;
import br.com.caelum.fj11.excecao.ValorInvalidoException;
import br.com.caelum.fj11.modelo.ContaCorrente;
import br.com.caelum.fj11.modelo.ContaPoupanca;
import br.com.caelum.fj11.modelo.SaldoInsuficienteException;

class TestaContas {
    public static void main(String[] args) {
//      Conta c = new Conta(); //este codigo não funciona porque a classe Conta passou a ser abstrata
        ContaCorrente cc = new ContaCorrente();
        ContaPoupanca cp = new ContaPoupanca();

//      c.deposita(1000); 
        //cc.deposita(1000); 
//      cp.deposita(1000);
//
        try {
            cc.deposita(-1000);
        } 
       // catch (IllegalArgumentException e) {// neste formato utiliza excption do java
        catch (ValorInvalidoException e) {            
          //System.out.println("Você tentou depositar um valor inválido na sua conta corrente");
            System.out.println(e.getMessage()); //utilizando mensagem ca classe ValorInvalidoException
        }

        try {
            cp.deposita(-1000);
        } 
  //      catch (IllegalArgumentException e) {// neste formato utiliza excption do java
          catch (ValorInvalidoException e) {   //neste formato esta dando erro    
            System.out.println("Você tentou depositar um valor inválido na sua conta poupança");
            //System.out.println(e.getMessage()); 
        }

//        

//      c.atualiza(0.01);
        cc.atualiza(0.01);
        cp.atualiza(0.01);


//      
         try {
             cc.saca(10000);
             System.out.println("Saque Efetudado com sucesso");    
        } //catch (RuntimeException e) {pode ser assim
         catch (SaldoInsuficienteException e) { //ou assim -- usando a classe cariada por nós
             //System.out.println(cc.getSaldo() + " Saldo insufuciente");
              System.out.println(cc.getSaldo() + " Saldo insufuciente");
         }
         catch (Exception e) { //ou assim
            //System.out.println(cc.getSaldo() + " Saldo insufuciente");
             System.out.println("Ocorreu um erro indeterminado");
        }

//      System.out.println(c.getSaldo());
        System.out.println(cc.getSaldo());
        System.out.println(cp.getSaldo());

        System.out.printf("O saldo cc é: %.2f", cc.getSaldo());
        System.out.printf("O saldo cp é: %.2f", cp.getSaldo());
    }
}
----
package br.com.caelum.fj11.modelo;

public class ContaPoupanca extends Conta {

    public void atualiza(double taxa) {
        this.saldo += this.saldo * taxa * 3;
   }

   public void deposita(double valor) {
        this.saldo += valor - 0.10;
   }

}

o erro esta neste ponto do código try { cp.deposita(-1000); } catch (ValorInvalidoException e) { //neste formato esta dando erro System.out.println("Você tentou depositar um valor inválido na sua conta poupança"); //System.out.println(e.getMessage()); }

Como informei anteriormente, quando retiro o metodo deposito da classe ContaPoupanca, o erro desaparece;

solução!

Luís, o problema é o seguinte:

Unreachable catch block for ValorInvalidoException. This exception is never thrown from the try statement body

Acredito que, se entendi bem, não existe um possível lançamento da exception ValorInvalidoException. O compilador só sabe disso pois ela é checked, então ele consegue "prever" a situação, digamos assim.

OBS: Ela só passa a ser checked se você tiver mudado a sua declaração para filha direta de Exception, como mencionado no exercício.

Dá uma olhada no seu método deposita, dentro da classe ContaPoupanca:

public class ContaPoupanca extends Conta {
   //outros métodos ...
  // não existe declaração de que este método irá lançar a exception
   public void deposita(double valor) {
        this.saldo += valor - 0.10;
   }

}

Acredito que a classe, funcionando, ficaria assim:

public class ContaPoupanca extends Conta {

   // outros métodos ...

   public void deposita(double valor) throws ValorInvalidoException {
        if (valor > 0) {
            this.saldo += valor - 0.10;
        } else {
            throw new ValorInvalidoException("Depósito de valor negativo.");
        }
   }

}

E ai, o que achou? Acredito que isso seja o suficiente para resolver o problema.

Vê ai e dá o retorno aqui.