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

Método com retorno e exceção

Ola, minha duvida é a seguinte, tem como eu controlar o acesso a um campo usando uma senha? Minha ideia é dado a senha correta retornar o atributo, dado senha errada lançar uma exceção SenhaInvalida que estende NullPointerException, seria algo do tipo:

    public Map<String, Conta> getContas(int senha) throws SenhaInvalida {
        try{
            if (this.autentica(senha))    return contas;
            else{ 
                return null;
                throw new SenhaInvalida(senha);
            }
        }catch (SenhaInvalida e){
            System.out.println(e);
        }

    }

Tem alguma solução que não seja fazer o try-catch no main?

5 respostas

Eu só tiraria esse try catch de dentro do método... vc lança a exception e trata no main mesmo, não tem problema.

Neste caso eu teria que usar um try-catch no main sempre que fosse invocar o metodo getContas(); ficaria com código repetido, algo que to tentando evitar.

Acredito que este código não compilaria por conta da sexta linha, pois se chegar ao else, nunca executará o throws para sua exception (unreachable statement).

De acordo com o que entendi olhando seu código, você quer disponibilizar as contas (presumo que venha de um atributo) caso a senha informada por parâmetro seja válida, certo?

Caso não seja, a intenção seria barrar a execução de algum jeito, lançando assim esta exceção, certo?

Bom, eu acho que não é tão interessante utilizar o try-catch dentro desse método, pois você poderia sempre tratá-lo no momento de sua execução para saber que, afinal, foi informada uma senha inválida.

Segue o código de como, na minha opinião, ficaria melhor.

public Map<String, Conta> getContas(int senha) throws SenhaInvalida {
        if (this.autentica(senha))
           return contas;
        else 
            throw new SenhaInvalida(senha); 
    }

Você pode escolher qual seria a melhor opção, como algumas:

  • sempre utilizar o tratamento na hora de sua invocação (mas lembre-se que exceptions de NullPointerException são unchecked);
  • criar um método que seria responsável por apenas invocar o apresentado acima, deixando-o privado e fazendo apenas com que este novo seja utilizado

(acrescentando nesta ideia, você poderia criar até mesmo algo semelhante um interceptador, que teria a parte de validação da senha abstraída e, de certa forma, centralizada);

  • mudar a implementação da sua SenhaInvalida, fazendo com que ela seja checked, assim, ela sempre deverá ser implementada com um try-catch

O que você acha?

solução!

E a outra ponta do código ter que tratar a exception faz parte do jogo.. se ele não quiser, não trata... O que não pode pode é vc lançar uma exception e vc mesmo tratar...

Sim realmente o código está errado, foi apenas para mostrar minha intenção, creio que realmente que o controle deverá ser feito em um main pois ao tentar fazer o controle no método ou até usando um método intermediário acaba em um erro de retorno, pois o retorno do método não pode estar condicionado, ele é obrigatório. Ou usando um método intermediário do tipo void por exemplo que invocasse o getContas(); o retorno do getContas() não alcançaria o main e sim apenas o método de controle tornando impossível a manipulação do Map.