好的,所以我一直试图得到这项任务中所有员工的总件数,工人数,总工资和平均工资的摘要。但是,当我在程序运行时单击程序中的“摘要按钮”时,我不断收到错误消息。 “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)
{
}
}
}
答案 0 :(得分:3)
啊,我记得那些不理解空引用异常的日子。而不是直接给你答案,最好告诉你如何诊断问题。
单击调用summaryButton_Click的按钮时会发生异常。 您知道该错误发生在该代码块中。空引用意味着您的一个变量为空(没有赋值)。
要在summaryButton_Click函数中的每一行上找到值放置断点,请运行该程序并单击按钮。然后,您将能够看到哪行代码会引发错误。我想你会发现它是名称变量,而片段变量没有被分配值。
答案 1 :(得分:1)
养成使用this
关键字引用类级变量的习惯。让其他正在阅读代码的程序员知道变量不存在于方法范围的某个地方。
至于您的空引用异常,当您尝试在pieces
中引用其值时,summaryButton_Click()
尚未初始化。您可能会因为所有名称与您的本地和类级别变量发生冲突而感到困惑。
现在我可以看到其他一些错误:
total_Pay
未在summaryButton_Click()
中初始化。请记住,当您尝试引用不存在的内存时,将获取空引用异常。
另外,由于某种原因,你在另一个类中嵌套了几个类。通过查看您发布的代码,我可以告诉您没有理由这样做。花点时间清理代码。您会发现可读代码 更易于理解。