0

好的,所以我一直在尝试获取此任务中所有员工的总件数、工人人数、总工资和平均工资的摘要。但是,当我在程序运行时单击程序中的“摘要按钮”时,我不断收到一条错误消息。“EX0406.exe 中发生了‘System.NullReferenceException’类型的未处理异常附加信息:对象引用未设置为对象的实例。”

那是我收到的错误消息。我不太确定该怎么做。

看到我被卡住了,我的代码不完整,但如果我能提供任何有关如何让我的摘要显示的帮助,我将不胜感激。我是编程新手。如果我需要更具体,请告诉我。

这是我所拥有的:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace EX0406
{
    public partial class PieceworkForm : Form
    {    //class variables 
        private string name;
        private int pieces;
        private string Average_Pay_Per_PERSON;
        private decimal total_Pay; 


        private List<MyData> MyList = new List<MyData>();

        public PieceworkForm()
        {
            InitializeComponent();
        }

        private void calculateButton_Click(object sender, EventArgs e)
        {
            //does the calculations 

            string name = (EmployeeNameTextBox).Text;
            int pieces = Convert.ToInt32(NumOfPiecesText.Text);

            if (name == "")
               MessageBox.Show("You must enter a name.");
            else if (pieces < 1 || pieces > 799)
               MessageBox.Show("Enter a number between 1 and 799.");
            else
            {
               MyData data = new MyData(name, pieces);
               MyList.Add(data);
               MessageBox.Show(string.Format("Amount Earned: {0:C}", data.Paid));
            }

        } 

        private void summaryButton_Click(object sender, EventArgs e)
        {       
            //Display info in msg box
            MyData data = new MyData(name, pieces);

            MyList.Add(data);

            try
            {
                string summaryString = ""
                                     + pieces.ToString()
                                     + "\n\n" + "Total pay:"
                                     + total_Pay.ToString("C")
                                     + "\n\n" + "Average pay per person:"
                                     + Average_Pay_Per_PERSON.ToString();

                MessageBox.Show(summaryString, "Summary:");
            }
            finally
            { 
                MessageBox.Show(SummaryOutPut.Text);  
            }
        }

        private void clearButton_Click(object sender, EventArgs e)
        {   //clears the employee and number of pieces text box
            EmployeeNameTextBox.Clear();
            NumOfPiecesText.Clear();
        }

        private void clearAllButton_Click(object sender, EventArgs e)
        {
            EmployeeNameTextBox.Clear();
            NumOfPiecesText.Clear();
            SummaryOutPut.Clear(); 
        }

        private void exitButton_Click(object sender, EventArgs e)
        {   //closes the program when user clicks exit
            this.Close(); 
        }

        private void nameTextBox_TextChanged(object sender, EventArgs e)
        {

        }



        public class MyData
        {

            public MyData(string name, int pieces)
            {
                //if else statements 
                Name = name;

                Pieces = pieces;
                if (Pieces < 200) //if pieces are less than 200, multiply by .50
                    Paid = Pieces * .50;
                else if (Pieces < 400)  //mulitply by .55 if less than 400
                    Paid = Pieces * .55;
                else if (Pieces < 600) // multiply by .60 if less than 600
                    Paid = Pieces * .60;
                else  // multiply by .65 if everything else doesnt apply 
                    Paid = Pieces * .65;
            }

            public string Name;
            public int Pieces;
            public double Paid;

        }

        private void SummaryOutPut_TextChanged(object sender, EventArgs e)
        {

        }

        private void fileToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void helpToolStripMenuItem_Click_1(object sender, EventArgs e)
        {

        }

        /* the following lines of code are menu items*/
        private void aboutToolStripMenuItem_Click_1(object sender, EventArgs e)
        {   //MSG box that displays name of lab and my name when clicking about and help item.
            MessageBox.Show("Lab 5 by J Soto"); 
        }

        private void exitToolStripMenuItem_Click_1(object sender, EventArgs e)
        {    //exit menu item that closes the windows form. 
            this.Close(); 
        }

        private void clearToolStripMenuItem_Click(object sender, EventArgs e)
        {    //menu item that clears the employee name and # of pieces text box.
            EmployeeNameTextBox.Clear();
            NumOfPiecesText.Clear();
        }

        private void clearAllToolStripMenuItem_Click(object sender, EventArgs e)
        {    //menu item to clear all the text boxes.
            EmployeeNameTextBox.Clear();
            NumOfPiecesText.Clear();
            SummaryOutPut.Clear(); 
        }

        private void fontToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void colorToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void calculatePayToolStripMenuItem_Click(object sender, EventArgs e)
        {  //does the calculations 
            string name = (EmployeeNameTextBox).Text;
            int pieces = Convert.ToInt32(NumOfPiecesText.Text);

            if (name == "")
                MessageBox.Show("You must enter a name.");
            else if (pieces < 1 || pieces > 799)
                MessageBox.Show("Enter a number between 1 and 799.");
            else
            {
                MyData data = new MyData(name, pieces);
                MyList.Add(data);

                MessageBox.Show(string.Format("Amount Earned: {0:C}", data.Paid));

            }
        } 

        private void summaryToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

    }
}
4

2 回答 2

3

Ah, I remember the days of not understanding null reference exceptions. Rather than give you the answer outright it's better to tell you how to diagnose the problem.

Your exception occurs when you click the button that calls summaryButton_Click. You know that the error occurs in that block of code. Null reference means that one of your variables is null (has no value assigned to it).

To find that value place break points on each line inside your summaryButton_Click function, run the program and click the button. You'll then be able to see which line of code throws the error. I think you'll find it's the name variable and the pieces variable haven't been assigned values.

于 2013-10-05T23:52:07.773 回答
1

this养成使用关键字引用类级变量的习惯。它让其他正在阅读您的代码的程序员知道该变量在方法范围内的某处不存在。

至于您的空引用异常,pieces当您尝试在summaryButton_Click(). 您可能会因为所有名称与本地和类级变量冲突而感到困惑。

现在我可以看到其他一些错误:

total_Pay也没有在summaryButton_Click(). 请记住,当您尝试引用不存在的内存时,您获得空引用异常。

此外,由于某种原因,您在另一个类中嵌套了一些类。通过查看您发布的代码,我可以告诉您没有理由这样做。花一些时间清理你的代码。你会发现可读的代码容易理解。

于 2013-10-06T00:02:26.437 回答