计算器应用程序崩溃



我正试图用C#构建一个简单的计算器应用程序,但我不知道为什么在执行以下步骤时它会崩溃。

  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);
        }
    }
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;如果它以CCD_ 3结束,则它将产生CCD_;如果是CCD_ 5,则将产生CCD_。只需利用Convert

小数分隔符是本地化的,您确定使用了正确的区域性(","而不是".")吗?

如果是这个问题,请查看这个堆栈问题

textBoxContents在单击子动作按钮后为null。使用textBoxContents = "0";textBoxContents = string.Empty;代替textBoxContents = null;。为什么要将其设置为null?

在Zero方法中调用textBoxContents.Length会导致NullReferenceException

正如前面提到的,Zero()中的逻辑有点迂回,当然也可能更小。

在减法函数中执行

textBoxContents=空;

然后在0,你有

textBoxContents[textBoxContents.Length-1]

这就是它崩溃的原因

在对textBoxContents 进行任何操作之前,您应该检查是否为null

最新更新