3
respostas

Erro durante execução - Removendo Contas do caixa eletrônico

Olá, o código executa sem sem problemas, exceto quando faço os seguintes passos nessa ordem: Cadastro uma nova conta (preencho campo de numero e nome); Deleto qualquer conta; Cadastro novamente uma conta; Visualizo a conta que acabei de cadastrar no comboBox. Então o programa para de executar e recebo esta mensagem :

"System.NullReferenceException: 'Referência de objeto não definida para uma instância de um objeto.'

contaSelecionada era null."

Obs.: indiferente do que eu preencha o erro continua

O erro aponta para esta parte do código:

private void MostraConta()
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
            textNumero.Text = Convert.ToString(contaSelecionada.Numero);
            textTitular.Text = contaSelecionada.Titular.Nome;
            textSaldo.Text = Convert.ToString("R$ " + contaSelecionada.Saldo);
            textValor.Text = "";
        }

código onde adiciono e deleto as contas:

public void AdicionaConta(Conta conta)
        {
            if(this.quantidadeDeContas == this.contas.Length)
            {
                Conta[] nova = new Conta[this.contas.Length * 2];
                for (int i = 0; i < this.quantidadeDeContas; i++)
                {
                    nova[i] = this.contas[i];
                }
                this.contas = nova;
            }
                this.contas[this.quantidadeDeContas] = conta;
                this.quantidadeDeContas++;
                comboContas.Items.Add(conta.Titular.Nome);
                destinoDaTransferencia.Items.Add(conta.Titular.Nome);
                MessageBox.Show("Conta cadastrada");
        }

        public void DeletaConta(Conta conta)
        {
            comboContas.Items.Remove(conta.Titular.Nome);
            int i;
            for (i = 0; i < this.quantidadeDeContas; i++)
            {
                if (this.contas[i] == conta)
                {
                    break;
                }
            }
            while (i + 1 <= this.quantidadeDeContas)
            {
                this.contas[i] = this.contas[i + 1];
                i++;
            }

        }

            private void btCadastraC_Click(object sender, EventArgs e)
        {
            CadastrarConta cadastro = new CadastrarConta(this);
            cadastro.ShowDialog();
        }

        private void btDeletaC_Click(object sender, EventArgs e)
        {
            Conta contaSelecionada = this.BuscaContaSelecionada();
            DeletaConta(contaSelecionada);
        }

Espero que consigam entender meu problema

3 respostas

Opa, não sou especialista em c#, mas acho que entendi. Ali onde você invoca o método que retorna a conta selecionada, verifica se ele ta retornando a conta mesmo ou simplesmente nulo... Se tiver retornando nulo, aí verifica no BuscaContaSelecionada o que pode ta indo errado.

Bem, de fato a Conta contaSelecionada retorna nulo, o que eu não sei é como verificar em BuscaContaSelecionada, em que momento ou porque esse erro ocorre.

 private Conta BuscaContaSelecionada()
        {
            int indiceSelecionado = comboContas.SelectedIndex;
            return contas[indiceSelecionado];
        }

estou horas alterando o código e não consigo entender o que se passa, qual o meu problema?

Igor, boa tarde, acredito que o índice selecionado no combobox de contas está diferente do de array de contas, o seu DeletaConta está removendo apenas do combobox mas não remove a conta no array. No seu Deleta também acredito que esta comparação

this.contas[i] == conta

não é exatamente a que você queira, essa comparação se não me engano irá comparar namespaces das classes creio ser melhor comparar pelo numero da conta.

this.contas[i].numeroDaConta == conta.numeroDaConta