3
respostas

O método Saque lançou uma exceção NullReferenceException

O método Sacar está lançando uma excessão NullReferenceException na linha:

Console.WriteLine(e.InnerException.Message);

Program.cs

static void Main(string[] args)
        {

            try
            {
                ContaCorrente conta1 = new ContaCorrente(4564, 789684);
                ContaCorrente conta2 = new ContaCorrente(7891, 456794);

                //conta1.Transferir(10000, conta2);
                conta1.Sacar(10000);
            }
            catch (OperacaoFinanceiraException e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);

                //Console.WriteLine("Informações da INNER EXCEPTION (exceção interna):");


                Console.WriteLine(e.InnerException.Message);
                Console.WriteLine(e.InnerException.StackTrace);



            }


            //Metodo();

            Console.WriteLine("Execução finalizada. Tecle enter para sair");
            Console.ReadLine();

        }

OperacaoFinanceiraException.cs

public class OperacaoFinanceiraException : Exception
    {
        public OperacaoFinanceiraException()
        {

        }

        public OperacaoFinanceiraException(string mensagem)
            : base(mensagem)
        {

        }

        public OperacaoFinanceiraException(string mensagem, Exception excecaoInterna)
            : base(mensagem, excecaoInterna)
        {

        }
    }

SaldoInsuficienteException.cs

public class SaldoInsuficienteException : OperacaoFinanceiraException
    {
        public double Saldo { get; }
        public double ValorSaque { get; }

        public SaldoInsuficienteException()
        {

        }

        public SaldoInsuficienteException(double saldo, double valorSaque)
            : this("Tentativa de saque do valor de " + valorSaque + " em uma conta com saldo de " + saldo)
        {
            Saldo = saldo;
            ValorSaque = valorSaque;
        }
        public SaldoInsuficienteException(string mensagem, Exception excecaoInterna)
            : base(mensagem, excecaoInterna)
        {

        }
        public SaldoInsuficienteException(string mensagem)
            : base(mensagem)
        {

        }
    }
3 respostas

Olá Mauricio, como vai?

Provavelmente o problema está no método Sacar. Precisamos adicionar um try/catch. Veja:

public void Sacar(double valor)
        {
            try
            {
                if (valor < 0)
                {
                    throw new ArgumentException("Valor inválido para o saque.", nameof(valor));
                }

                if (_saldo < valor)
                {
                    ContadorSaquesNaoPermitidos++;
                    throw new SaldoInsuficienteException(Saldo, valor);
                }
            }
            catch (SaldoInsuficienteException ex)
            {
                ContadorTransferenciasNaoPermitidas++;
                throw new OperacaoFinanceiraException("Operação não realizada.", ex);
            }            

            _saldo -= valor;
        }

Qualquer dúvida estamos por aqui.

Abraços e bons estudos!

Ana, tudo bem!?

Obrigado pelo retorno, ao fazer a sua sugestão a exceção é tratada no método sacar e quando vou chamar o método transferir, a exceção também é tratada em sacar.

Na aula, Sacar não tem o try, catch. Ele está assim:

        public void Sacar(double valor)
        {
            if (valor < 0)
            {
                throw new ArgumentException("Valor inválido para o saque.", nameof(valor));
            }

            if (_saldo < valor)
            {
                ContadorSaquesNaoPermitidos++;
                throw new SaldoInsuficienteException(Saldo, valor);
            }

            _saldo -= valor;
        }

E o Transferir, assim:

        public void Transferir(double valor, ContaCorrente contaDestino)
        {
            if (valor < 0)
            {
                throw new ArgumentException("Valor inválido para a transferência.", nameof(valor));
            }

            try
            {
                Sacar(valor);
            }
            catch(SaldoInsuficienteException ex)
            {
                ContadorTransferenciasNaoPermitidas++;
                throw new OperacaoFinanceiraException("Operação não realizada.", ex);
            }

            contaDestino.Depositar(valor);
        }

Pelo que eu analisei, o Sacar não está copulando os dados dos parâmetros abaixo, por isso o NullReferenceException

        public SaldoInsuficienteException(string mensagem, Exception excecaoInterna)
            : base(mensagem, excecaoInterna)
        {

        }

Olá Mauricio, tudo bem. Obrigada por perguntar!

Realmente na aula o professor não utiliza o try/catch, mas se reparar, ele também não utiliza o método Sacar(), com o InnerException. Ele acaba deixando em aberto. É algo que podemos ir conferindo no código inteiro e por nossa conta ir treinando em inserir os try/catch.

Sem o try/catch o InnerException não consegue capturar o que está acontecendo no código. Recomendo a leitura deste artigo: Como tratar uma exceção usando try/catch.

Qualquer dúvida estamos por aqui.

Abraços

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software