Java,似乎找不到我继承的问题
我正在努力找出我的问题 出于某种原因,当我试图设置销售人员的销售额时,它只会将第一个销售人员创建的销售额设置为最后一个销售人员的销售额 这里EmployeeDatabase保存和EmployeeList,EmployeeList是雇员类型的容器对象 我有其他类的代码,但我认为这是所有需要的。。。很抱歉代码中没有注释 我的输出:Java,似乎找不到我继承的问题,java,Java,我正在努力找出我的问题 出于某种原因,当我试图设置销售人员的销售额时,它只会将第一个销售人员创建的销售额设置为最后一个销售人员的销售额 这里EmployeeDatabase保存和EmployeeList,EmployeeList是雇员类型的容器对象 我有其他类的代码,但我认为这是所有需要的。。。很抱歉代码中没有注释 我的输出: John 12000.0 Set sales to: 12000.0 Joan 10000.0 Set sales to: 10000.0 Jack 5000.0 Set
John 12000.0
Set sales to: 12000.0
Joan 10000.0
Set sales to: 10000.0
Jack 5000.0
Set sales to: 5000.0
Name: John Commision: 0.03 Sales: 5000.0
Name: Joan Commision: 0.04 Sales: 0.0
Name: Jack Commision: 0.02 Sales: 0.0
Payroll: 150.0
代码:EmployeeDatabase
public class EmployeeDatabase
{
public static void main(String[] args)
{
EmployeeList emp = new EmployeeList();
/*emp.enqueue(new SalesManager("Gee", 1000));
emp.enqueue(new SalesManager("Gal", 1000));
emp.enqueue(new SalesManager("Gem", 1000));*/
emp.enqueue(new SalesPerson("John", 0.03));
emp.enqueue(new SalesPerson("Joan", 0.04));
emp.enqueue(new SalesPerson("Jack", 0.02));
/*emp.enqueue(new Manager("Fred", 10000));
emp.enqueue(new Manager("Frank", 5000));
emp.enqueue(new Manager("Florence", 3000));
emp.enqueue(new Programmer("Linda", 7));
emp.enqueue(new Programmer("Larry", 5));
emp.enqueue(new Programmer("Lewis", 3));*/
/*emp.setHours("Linda", 35);
emp.setHours("Larry", 23);
emp.setHours("Lewis", 3);*/
emp.setSales("John", 12000);
emp.setSales("Joan", 10000);
emp.setSales("Jack", 5000);
/*emp.setSales("Gee", 4000);
emp.setSales("Gal", 3000);
emp.setSales("Gem", 2000);
emp.setSalary("Gee", 1000);
emp.setSalary("Gal", 2000);
emp.setSalary("Gem", 3000);*/
emp.display();
}
}
雇员名单
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class EmployeeList
{
Queue<Employee> empList = new LinkedList<Employee>();
Employee find(String nm)
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
if(!em.name.equals(nm))
{
return em;
}
}
return null;
}
double payroll()
{
double payroll = 0.0;
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
payroll += em.computePay();
}
return payroll;
}
void display()
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
em.display();
}
System.out.println("\nPayroll: " + payroll());
}
void enqueue(Employee e)
{
empList.add(e);
}
void setHours(String nm, int hrs)
{
Employee em = find(nm);
/*if(em == null)
return;*/
em.setHours(hrs);
}
void setSalary(String nm, float salary)
{
Employee em = find(nm);
/*if(em == null)
return;*/
em.setSalary(salary);
}
void setSales(String nm, double sales)
{
System.out.println(nm + " " + sales);
Employee em = find(nm);
/*if(em == null)
return;*/
em.setSales(sales);
}
}
工资雇员
public class WageEmployee extends Employee
{
double rate;
double hours;
WageEmployee(String name)
{
this.name = name;
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}
}
WageEmployee(String name, double rate)
{
this.name = name;
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}
this.rate = rate;
}
double computePay()
{
return rate * hours;
}
void setHours(double hrs)
{
hours = hrs;
System.out.println("Set Hours to: " + hours);
}
void display ()
{
System.out.println("Name: " + name + " Hours: " + hours + " Rate: " + rate);
}
}
您的
find
方法中有一个错误:
Employee find(String nm)
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
if(!em.name.equals(nm)) // should be if(em.name.equals(nm))
{
return em;
}
}
return null;
}
员工查找(字符串nm)
{
迭代器it=empList.Iterator();
while(it.hasNext())
{
Employee em=(Employee)it.next();
if(!em.name.equals(nm))//应该是if(em.name.equals(nm))
{
返回em;
}
}
返回null;
}
这将导致在为以后的员工调用
setSales
时返回第一个员工 您的find
方法中有一个bug:
Employee find(String nm)
{
Iterator<Employee> it = empList.iterator();
while(it.hasNext())
{
Employee em = (Employee)it.next();
if(!em.name.equals(nm)) // should be if(em.name.equals(nm))
{
return em;
}
}
return null;
}
员工查找(字符串nm)
{
迭代器it=empList.Iterator();
while(it.hasNext())
{
Employee em=(Employee)it.next();
if(!em.name.equals(nm))//应该是if(em.name.equals(nm))
{
返回em;
}
}
返回null;
}
这将导致在为以后的员工调用
setSales
时返回第一个员工 这段代码中有两个问题
首先,有额外的!在find方法中
if(!em.name.equals(nm))
应该是if(em.name.equals(nm))
第二个问题是在工资员工构造函数中创建的填充
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}`
if(this.name.length()<14)
{
while(this.name.length()<14)
{
this.name+=“”;
}
}`
此代码使您要查找的“John”
实际上是“John”
。注意间距。(射击,降价消除了大部分,但你得到了在最后额外间隔的想法)。这会导致名称之间的比较永远不相等,从而在您尝试处理不存在的员工时产生空指针异常
有三种可能的解决办法。首先,在比较之前使用
em.name
上的String.trim方法。第二,在比较之前,以与存储搜索名称相同的方式填充搜索名称。第三,您可以完全删除填充(我不知道您的用例,但是String.format可能只允许您在输出时填充)。这段代码中有两个问题
首先,有额外的!在find方法中
if(!em.name.equals(nm))
应该是if(em.name.equals(nm))
第二个问题是在工资员工构造函数中创建的填充
if(this.name.length() < 14)
{
while(this.name.length() < 14)
{
this.name += " ";
}
}`
if(this.name.length()<14)
{
while(this.name.length()<14)
{
this.name+=“”;
}
}`
此代码使您要查找的“John”
实际上是“John”
。注意间距。(射击,降价消除了大部分,但你得到了在最后额外间隔的想法)。这会导致名称之间的比较永远不相等,从而在您尝试处理不存在的员工时产生空指针异常
有三种可能的解决办法。首先,在比较之前使用
em.name
上的String.trim方法。第二,在比较之前,以与存储搜索名称相同的方式填充搜索名称。第三,您可以完全删除填充(我不知道您的用例,但String.format可能允许您仅在输出时填充)。使用调试器或println()跟踪问题。显然,EmployeeList.setSales()不起作用,它使用EmployeeList.find()进行查找,但它的查找有点问题……这就是我一直在做的。正如Zong Li在下面所说的,他认为删除“!”会给我一个空指针异常。也许你在修复“!”时由于找不到匹配的名称,您还有第二个问题?请使用调试器或println()跟踪该问题。显然,EmployeeList.setSales()不起作用,它使用EmployeeList.find()进行查找,但它的查找有点问题……这就是我一直在做的。正如Zong Li在下面所说的,他认为删除“!”会给我一个空指针异常。也许你在修复“!”时您还有第二个问题,因为找不到匹配的名称?这给了我一个空指针异常,我已将其从“否”更改为“否”!到一个!以前,因为我认为这是find的问题。这给了我一个空指针异常,我已经将它从no!到一个!以前,因为我认为这是find的问题。我已经从find方法中删除了填充代码和“!”。在第二个SetSales中,我仍然从SetSales方法得到一个空指针异常。我认为这仍然是find方法或名称格式中的一个问题。现在,我已经从find方法中删除了填充代码和“!”。在第二个SetSales中,我仍然从SetSales方法得到一个空指针异常。我认为这仍然是find方法或名称格式中的一个问题。现在正在调查这件事。