2013-02-21 3 views
-2

Моя проблема заключается в том, что я пытаюсь создать приложение, и, насколько я вижу, он должен быть чистым, и я не могу найти ошибку вообще.NullReferenceException Unhandled (Не удается найти источник ошибки)

Вот мой код ниже. Я прокомментирую, где ошибка. Форма Код

namespace TechBank 
{ 
    public partial class Tech_Bank : Form 
    { 
     CAccount currentAccount = null; 

     CBank myBank = new CBank(); 

     private void displayBalance() 
     { 
      if (lstAccounts.Items.Count != 0) 
      { 
       txtBalance.Text = currentAccount.Balance.ToString; //where the error hits 
       txtCustomer.Text = currentAccount.CustomerName; 
       txtAccountType.Text = Convert.ToString(currentAccount.AccountType); 
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Open_Account form = new Open_Account(); 
      form.ShowDialog(); 
      if (form.DialogResult == DialogResult.OK) 
      { 
       currentAccount = new CAccount(typeAccount.checking, "", 4); 
       if (form.rbtChequing.Checked) 
        currentAccount.AccountType = typeAccount.checking; 
       if (form.rbtSavings.Checked) 
        currentAccount.AccountType = typeAccount.savings; 

       try 
       { 
        currentAccount.Balance = Convert.ToDouble(form.txtStartingBalance.Text); 
       } 
       catch (FormatException) 
       { 
        MessageBox.Show("Please enter valid information", "Error in account creation, please double check the values are correct"); 
       } 

       currentAccount.CustomerName = form.txtCustomerName.Text; 

       myBank.OpenAccount(currentAccount); 
       lstAccounts.Items.Add(currentAccount.AccountID); 
       currentAccount = myBank.GetAccount(lstAccounts.SelectedIndex); 
       lstAccounts.SelectedIndex = lstAccounts.Items.Count - 1; 
       displayBalance(); 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Transaction form = new Transaction(currentAccount); 
      form.ShowDialog(); 
      if (form.DialogResult == DialogResult.OK) 
      { 
      } 
      displayBalance(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      if (lstAccounts.Items.Count != 0) 
      { 
       myBank.CloseAccount(currentAccount); 
       lstAccounts.Items.RemoveAt(lstAccounts.SelectedIndex); 
       txtAccountType.Clear(); 
       txtBalance.Clear(); 
       txtCustomer.Clear(); 
      } 
     } 

     private void btnExit_Click(object sender, EventArgs e) 
     { 
      System.Environment.Exit(0); 
     } 


     private void lstAccounts_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      currentAccount = myBank.GetAccount(lstAccounts.SelectedIndex); 
      displayBalance(); 
     } 
    } 
} 

CAccount.cs Код Ниже

namespace TechBank 
{ 
    public enum typeAccount 
    { 
     checking, 
     savings 
    } 

    public class CAccount 
    { 
     private static Random randomNumber = new Random(); 

     private typeAccount mAccountType; 
     private double mBalance; 
     private string mCustomer; 
     private string mID; 

     public CAccount(typeAccount newType, string newCustomer, double newBalance) 
     { 
      mAccountType = newType; 
      mCustomer = newCustomer; 
      mBalance = newBalance; 
      mID = Convert.ToString(randomNumber.Next(1, 9999)); 
     } 

     public typeAccount AccountType 
     { 
      get { return mAccountType; } 
      set { mAccountType = value; } 
     } 

     public double Balance 
     { 
      get { return mBalance; } 
      set { mBalance = value; } 
     } 

     public string CustomerName 
     { 
      get { return mCustomer; } 
      set { mCustomer = value; } 
     } 

     public string AccountID 
     { 
      get { return mID; } 
     } 

     public void Deposit(double Amount) 
     { 
      if (IsPositiveNumber(Amount, 0)) 
       mBalance += Amount; 
     } 

     public bool IsPositiveNumber(double larger, double smaller) 
     { 
      return (larger >= smaller); 
     } 

     public void Withdraw(double Amount) 
     { 
      if (IsPositiveNumber(mBalance, Amount)) 
       mBalance -= Amount; 
     } 
    } 
} 

Пожалуйста, сообщите мне, если вам нужно больше кода.

+0

Он показывает, где произошла ошибка, а также инициализирует currentAccount в обработчике событий кнопки. – Inisheer

+2

Покажите нам полное исключение, включая трассировку стека и т. Д. –

+1

Это была бы прекрасная возможность научиться более эффективно использовать ваш отладчик. Если вы используете Visual Studio, используйте параметр Debug -> Exceptions, чтобы разрешить нарушение любого исключения CLR. Теперь ваше приложение будет ломаться, когда генерируется исключение, а не когда оно необработано - это даст вам возможность просмотреть все состояние приложения и действительно понять, что происходит. Если вы не используете VS - большинство других отладчиков (включая WinDbg, mdbg и т. Д.) Поддерживают это. –

ответ

1

Нулевые эталонные исключения всегда означают одно и то же: что вы не инициализировали переменную. В этом случае вы объявляете CAccount currentAccount = null; в качестве члена класса. Если вам нужно, чтобы он был не нулевым, его нужно инициализировать, вызвав new CAccount() некоторое время до вызова DisplayBalance(). Например, если пользователь нажимает кнопку Button2 перед нажатием кнопки 1, вы получите null ref. Аналогично, если myBank.GetAccount() возвращает значение null, вы также получите null ref. Трассировка стека поможет сузить, какая из причин является причиной.

0

Поскольку вы инициализируете «currentAccount» значением null, у вас действительно нет гарантии, что он будет установлен при доступе к нему в вашей функции displayBalance. Я понимаю, что вы можете подумать, что он установлен, потому что вы всегда устанавливаете его, прежде чем вы назовете «displayBalance()», но, очевидно, этого не происходит.

лучший вариант, чем установка переменного уровня класса для другой функции доступа заключается в пропускании CAccount в качестве параметра метод «displayBalance()», меняя свою подпись

private void displayBalance(CAccount account) 
    { 
     if (lstAccounts.Items.Count != 0) 
     { 
      txtBalance.Text = account.Balance.ToString; 
      txtCustomer.Text = account.CustomerName; 
      txtAccountType.Text = Convert.ToString(account.AccountType); 
     } 
    } 

Поступая таким образом , вы можете гарантировать правильность установки значения, входящего в функцию.

0

Не является функцией ToString? не должно выглядеть так:

txtBalance.Text = currentAccount.Balance.ToString(); 
Смежные вопросы