2013-12-06 4 views
0

Я пытаюсь создать простое приложение калькулятора на C#, и я не знаю, почему он сбой, когда я делаю следующие шаги.Калькулятор Application Crashes

  1. Введите 0,2
  2. Нажмите Вычитание
  3. Введите 0

сбой приложения сразу. Я предполагаю, что это как-то связано с функцией Zero(), поскольку это то, что выполняется при нажатии кнопки Zero. Условные утверждения предназначены для того, чтобы заботиться о случаях, когда они не должны возникать, как последовательные шифры и т. Д. Вот исходный код. Кстати, функции для других цифр идентичны.

public partial class MainWindow : Window 
    { 
     protected double firstNumber, secondNumber; 
     protected string textBoxContents; 
     protected int selectedFunction; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      firstNumber = 0; 
      secondNumber = 0; 
      selectedFunction = 0; 
      textBoxContents = "0"; 
     } 
     private void Zero(object sender, RoutedEventArgs e) 
     { 
      if (Convert.ToDouble(textBoxContents) > 0 || textBoxContents[textBoxContents.Length - 1] == '.') 
      { 
       if(selectedFunction != 0) 
        textBoxContents = textBoxContents + "0"; 
      } 
      else if (textBoxContents == null) 
      { 
       textBoxContents = textBoxContents + "0"; 
      } 
      ResultBox.Content = textBoxContents; 
     } 
     private void One(object sender, RoutedEventArgs e) 
     { 
      textBoxContents = textBoxContents + "1"; 
      ResultBox.Content = textBoxContents; 
     } 
     private void Decimal(object sender, RoutedEventArgs e) 
     { 
      textBoxContents = textBoxContents + "."; 
      ResultBox.Content = textBoxContents; 
     } 
     private void Addition(object sender, RoutedEventArgs e) 
     { 
      firstNumber = Convert.ToDouble(textBoxContents); 
      textBoxContents = null; 
      selectedFunction = 1; 
     } 
     private void Subtraction(object sender, RoutedEventArgs e) 
     { 
      firstNumber = Convert.ToDouble(textBoxContents); 
      textBoxContents = null; 
      selectedFunction = 2; 
     } 
     private void Multiplication(object sender, RoutedEventArgs e) 
     { 
      firstNumber = Convert.ToDouble(textBoxContents); 
      textBoxContents = null; 
      selectedFunction = 3; 
     } 
     private void Division(object sender, RoutedEventArgs e) 
     { 
      firstNumber = Convert.ToDouble(textBoxContents); 
      textBoxContents = null; 
      selectedFunction = 4; 
     } 
     private void Result(object sender, RoutedEventArgs e) 
     { 
      secondNumber = Convert.ToDouble(textBoxContents); 
      double thirdNumber = 0; 
      switch (selectedFunction) 
      { 
       case 1: 
        thirdNumber = firstNumber + secondNumber; 
        break; 
       case 2: 
        thirdNumber = firstNumber - secondNumber; 
        break; 
       case 3: 
        thirdNumber = firstNumber * secondNumber; 
        break; 
       case 4: 
        thirdNumber = firstNumber/secondNumber; 
        break; 
       default: 
        break; 
      } 
      textBoxContents = Convert.ToString(thirdNumber); 
      ResultBox.Content = textBoxContents; 
     } 
     private void ClearEverything(object sender, RoutedEventArgs e) 
     { 
      textBoxContents = null; 
      firstNumber = 0; 
      secondNumber = 0; 
      selectedFunction = 1; 
      ResultBox.Content = Convert.ToString(0); 
     } 
     private void ToggleNegative(object sender, RoutedEventArgs e) 
     { 
      if (Convert.ToDouble(textBoxContents) != 0) 
      { 
       textBoxContents = Convert.ToString(Convert.ToDouble(textBoxContents) * -1); 
       ResultBox.Content = textBoxContents; 
      } 
      else 
       ResultBox.Content = Convert.ToString(0); 
     } 
    } 
+1

Когда вы говорите 'Enter 0', вы имеете в виду тип' 0' и нажмите 'Enter'? –

+0

Сообщите об ошибке – Cheese

+0

Переименуйте текстBoxContents, чтобы сказать textValue. Это далеко не ясно (по крайней мере, мудрый). Является ли это TextBox или TextBox.Text. –

ответ

1
private void Zero(object sender, RoutedEventArgs e) 
{ 
    if (Convert.ToDouble(textBoxContents) > 0 || 
     textBoxContents[textBoxContents.Length - 1] == '.') 
    { 
     if(selectedFunction != 0) 
      textBoxContents = textBoxContents + "0"; 
    } 
    else if (textBoxContents == null) 
    { 
     textBoxContents = textBoxContents + "0"; 
    } 
    ResultBox.Content = textBoxContents; 
} 

Эта логика кажется хребтом. Если значение текстового поля пуст, тогда он будет взорваться из-за индексатора с другой стороны ||. Я думаю, что это может быть переписан, чтобы сказать:

private void Zero(object sender, RoutedEventArgs e) 
{ 
    var dblVal = Convert.ToDouble(textBoxContents.Text); 
    textBoxContents.Text = dblVal.ToString(); 
    ResultBox.Content = textBoxContents.Text; 
} 

Другими словами, если текстовое поле пустое преобразование даст 0.0; если он заканчивается на 1., он даст 1.0; если это .5, он даст 0.5. Просто используйте Convert.

+1

Не упоминание null + «0» - это немного проблема .... –

+0

Большое вам спасибо! Я понятия не имел, что «Конвертировать» можно было бы использовать таким образом. Любые другие советы о том, как я могу еще больше оптимизировать код? – Siddharth

1

Десятичный разделитель локализован, вы уверены, что вы используете правильную культуру («» вместо «»)?

Если это вопрос, проверить это Stack Question

+0

Это не проблема, но это хороший момент.Я проверю это! Спасибо огромное! – Siddharth

0

в функции вычитателыюм вы делаете

textBoxContents = NULL;

, а затем в нуле у вас есть

textBoxContents [textBoxContents.Length - 1]

вот почему он выходит из строя

вы должны проверить нуль перед любой операцией по textBoxContents

1

textBoxContents имеет значение null после нажатия кнопки вычета. Вместо textBoxContents = null;textBoxContents = "0"; или textBoxContents = string.Empty;. Почему вы все равно устанавливаете его на нуль?

Вызов textBoxContents.Length в вашем методе Zero вызывает NullReferenceException.

Как уже упоминалось, перед вашей логикой в ​​Zero() швы немного обходны и, конечно, могут быть меньше.

+0

Я устанавливал его в значение «null», потому что в голове это пустая строка «String». Я просто понял разницу между пустым и «нулевым». – Siddharth

Смежные вопросы