1
resposta

IndexOutOfRangeException

Boa noite. Ainda sou novato em desenvolvimento e estou com dificuldades para tratar uma "IndexOutOfRangeException". Gostaria que o meu botão de transferir gerasse uma mensagem de erro em 3 situações: 1° Se o valor da transferência for maior do que o saldo (OK, consegui); 2° Se o valor da transferência for negativo (OK, consegui); 3° Se o destinatário da transferência não tiver sido selecionado no combo box .(clicar no botão de transferir sem ter selecionado a conta destino). (Não consegui).

Será se alguém com mais conhecimento consegue me ajudar no 3° caso? Vi através dos LOGS que a exception gerada é "IndexOutOfRangeException".

Segue meu código:

Método Transferir:

        public void Transfere (Conta destino, double valor)
        {
            {
                this.Saca(valor);
                destino.Deposita(valor);
            }
        }

Botão Transferir:

        private void button3_Click(object sender, EventArgs e)
        {
            Conta c = BuscaContaSelecionada();
            Conta cD = DestinoTransferencia();

            string textoValorSaque = textoValor.Text;
            double valor = Convert.ToDouble(textoValorSaque);
            try
            {
                c.Transfere(cD, valor);
                MessageBox.Show("Valor Transferido. R$ " + valor);
            }
            catch (SacaException exception)
            {
                MessageBox.Show("Saldo Insuficiente. \nSaldo disponível: R$ " + c.Saldo);
            }
            catch (ArgumentException exception)
            {
                MessageBox.Show("Valor inválido para transferência. \n" + valor);
            }
            MostraConta(c);

Método BuscaContaSelecionada:

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

Método DestinoTransferência:

private Conta DestinoTransferencia()
        {
            int indiceSelecionado = comboTransfere.SelectedIndex;
            Conta cDestino = contas[indiceSelecionado];
            return cDestino;
        }

Além de não saber como tratar este tipo de exceção também não sei em qual método devo inserir o código... O log alarma o "BuscaContaSelecionada()" com "IndexOutOfRangeException".

Muito obrigado!

Obs.: Caso não tenha ficado claro, a função de transferir funciona normalmente, o que eu gostaria é que o sistema gerasse uma mensagem de erro para o usuário se ele não selecionar a conta destino, ao invés de gerar uma exceção e fechar.

1 resposta

Olá Emerson,

esse erro ocorre porque quando o usuário não escolhe nenhuma conta no seletor, a propriedade comboBox.SelectedIndex acaba assumindo o valor -1. Então tanto no BuscaContaSelecionada quanto no DestinoTransferencia, quando ele vai buscar no array de contas, como está com -1 ele solta o IndexOutOfRangeException.

Você tem duas saídas de como mostrar este erro. A primeira seria button3_Click, antes de executar qualquer lógica ali dentro, você verifica se o algum dois dois comboBox estão com o SelectedIndex com -1. Se sim, solta a mensagem de erro. Caso contrário, executa a lógica atual de buscar as contas e tentar fazer a transferência.

Uma segunda opção, é você fazer esta verificação se o SelectedIndex está -1 dentro dos métodos BuscaContaSelecionada e DestinoTransferencia. Se estiverem com -1, os métodos disparam uma exception informando que a conta não foi selecionada. Ai você pode mover aquele bloco no button3_Click

 Conta c = BuscaContaSelecionada();
Conta cD = DestinoTransferencia();

string textoValorSaque = textoValor.Text;
double valor = Convert.ToDouble(textoValorSaque);

para dentro do try e adicionar mais um catch que captura esta exception de conta não selecionada.