Solucionado (ver solução)
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.