【问题标题】:Calculator Application Crashes计算器应用程序崩溃
【发布时间】:2013-12-06 13:48:43
【问题描述】:

我正在尝试用 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);
        }
    }

【问题讨论】:

  • 当您说Enter 0 时,您的意思是输入0 并按Enter
  • 将 textBoxContents 重命名为 textValue。这远非明确(至少意图明智)。无论是 TextBox 还是 TextBox.Text。
  • 是的!你是对的。我需要改正名字。谢谢!

标签: c#


【解决方案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

【讨论】:

  • 非常感谢!我不知道可以以这种方式利用Convert。关于如何进一步优化代码的任何其他提示?
【解决方案2】:

小数点分隔符已本地化,您确定您使用的是正确的文化(“,”而不是“.”)吗?

如果是这个问题,请查看Stack Question

【讨论】:

  • 这不是问题,但这是一个好点。我会检查出来的!非常感谢!
【解决方案3】:

点击减法按钮后,textBoxContents 为空。 而不是textBoxContents = null; 使用textBoxContents = "0";textBoxContents = string.Empty;。为什么你还是把它设置为null?

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

正如其他人之前提到的,您在 Zero() 中的逻辑有点迂回,而且肯定可以更小。

【讨论】:

  • 我将它设置为null,因为在头脑中这是一个空的String。我才意识到空和null之间的区别。
【解决方案4】:

在你正在做的减法函数中

textBoxContents = null;

然后你有

textBoxContents[textBoxContents.Length - 1]

这就是它崩溃的原因

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

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多