Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Erro - conversão

Não entendi por que ta dando esse erro ao tentar converter o textoValor(de string) para Double

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

Ele não deixa nem eu executar o código/adicionar valor no campo texto..

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace banco2
{
    public partial class Form1 : Form
    {
        private Conta conta;
        private Cliente cliente;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Conta conta = new Conta();
            Cliente cliente = new Cliente();
            conta.Titular = cliente;
            cliente.Nome = "Bruno";
            conta.Deposito(250.0);
            conta.Numero = 1;
            this.MostraConta();


        }

        private void button1_Click(object sender, EventArgs e)
        {

            string textoDeposito = textoValor.Text;
            double valorDeposito = Convert.ToDouble(textoDeposito);
            this.conta.Deposito(valorDeposito);
            this.MostraConta();

        }
        private void MostraConta()
        {

            textoNumero.Text = Convert.ToString(this.conta.Numero);
            textoSaldo.Text = Convert.ToString(this.conta.Saldo);
            textoTitular.Text = this.cliente.Nome;

        }
    }
}
10 respostas

Oi, Bruno.

Qual valor que você está tentando converter? O que você digita no campo texto?

Se tiver tentando colocar um valor com vírgula tipo "3,14" vai dar problema. Ele só aceita ponto!

Qualque valor, coloquei 200.0, 2.0, ele retorna o mesmo erro. Agora fiz uma alteração aqui e MUDOU o erro.

An unhandled exception of type 'System.NullReferenceException' occurred in banco2.exe

Additional information: Referência de objeto não definida para uma instância de um objeto.

Alterei o código para

 private void button1_Click(object sender, EventArgs e)
        {

            string textoDeposito = textoValor.Text;
            double valorDeposito = Convert.ToDouble(textoDeposito);
            this.conta.Deposito(valorDeposito);
            textoValor.Text = Convert.ToString(this.conta.Saldo);
            MessageBox.Show("Operação realizada com sucesso");

            this.MostraConta();

Mas agora o erro acima aparece na linha " this.conta.Deposito(valorDeposito);"

Pelo que entendi o "valorDeposito" ta recebendo um valor Null, mas não sei o prq...

solução!

Quase. Não é o valorDeposito. É a conta.

NullReferenceException significa que você está tentando acessar um atributo ou método de uma referência nula. Pelo seu código alterado, isso provavelmente aconteceu na seguinte linha de código:

this.conta.Deposito(valorDeposito);

Olhando seu código anterior, no método Form1_Load você está instanciando uma variável local chamada conta, mas nunca cria uma instância para o atributo conta, deixando este sempre nulo. Por isso o NullReferenceException

Seu Form1_Load tem instanciar o atributo e não uma variável, veja:

private void Form1_Load(object sender, EventArgs e)
{
    this.conta = new Conta();
    Cliente cliente = new Cliente();
    this.conta.Titular = cliente;
    cliente.Nome = "Bruno";
    this.conta.Deposito(250.0);
    this.conta.Numero = 1;
    this.MostraConta();
}

Deixa eu ver se entendi, a linha

 Conta conta = new Conta();

Instancia uma variavel LOCAL chamada conta?

Ao dizer que ESSA CONTA, recebe a Classe Conta (e suas propriedades), eu posso acessar os dados dela normalmente em qualquer parte do código?

            this.conta = new Conta();

Exato.

Isso daqui é uma declaração local feita em métodos:

Conta conta = new Conta();

Isso daqui é uma declaração de um atributo de classe:

public partial class Form1 : Form
{
    private Conta conta;
    (...)
}

Um atributo de classe pode ser utilizado por todos os métodos da classe.

O operador this possui a referência para o objeto chamado. Por isso, quando você usa o this, o Visual Studio exibe como opções para você os atributos e os métodos da classe onde está.

Ficou mais claro?

Então, ultima vez só para confirmar meu raciocinio:

Isso daqui é uma declaração de um atributo de classe:

public partial class Form1 : Form
{
    private Conta conta;
    (...)
}

A classe CONTA possui o atributo CONTA (que é uma variavel, instanciada no método local), por isso então precisarei sempre fazer o

this.conta = new Conta();

Que é onde direi para o código que o atributo da classe (conta) está relacionada com o método new Conta().

Do contrário o atributo conta fica vazio pois não tem nada apontando para ele, é isso?

Exato, mas só uma correção nessa sua afirmação aqui:

A classe CONTA possui o atributo CONTA (que é uma variavel, instanciada no método local), por isso então precisarei sempre fazer o

Não é a classe conta quem possui o atributo conta. É a classe Form1 quem possui o atributo conta do tipo Conta.

Veja:

public partial class Form1 : Form
{
    private Conta conta; // atributo conta do tipo Conta da classe Form1

    // Esse atributo aqui é desnecessário! Veja o método load!
    private Cliente cliente;

    // Construtor da classe Form1
    public Form1()
    {
        // Instanciando todos os componentes visuais do formulário
        InitializeComponent();
    }

    // Método do evento onload do formulário Form1
    private void Form1_Load(object sender, EventArgs e)
    {
        // Instanciando uma nova conta para o atributo conta
        this.conta = new Conta();

        Cliente cliente = new Cliente();
        cliente.Nome = "Bruno";
        this.conta.Titular = cliente; // Não precisa do atributo cliente, você tem a referência na conta!

        this.conta.Deposito(250.0);
        this.conta.Numero = 1;
        this.MostraConta();
    }   
    (...)
}

É no método load da classe Form1 que você cria uma nova instância de Conta (classe) para o atributo conta da classe Form1 que foi instanciada.

Entendi Arthur, muito obrigado pela ajuda. Essas coisas me confundem ainda, mas tu foi bem esclarecedor, obrigado mesmo!

Orientação a objetos no início é confuso mesmo, mas pegando direitinho os detalhes e a prática o monstro vai diminuindo rs.