我需要帮助我在JAVA中编写的程序(空指针异常)

时间:2010-11-20 18:56:30

标签: java arrays constructor nullpointerexception

我试图写一个关于员工和其他staaff支付的程序,我有一个名为Employee的抽象超类,然后下面的FullTimeEmployee,PartTimeEmployee,Orders和Salesman是Employee的子类。 我在Salesman中只有一个零指针问题,我试图计算每次销售所得的奖金。

这是我在Salesman类中的代码

    public Salesman(String firstname, String lastname,int code, String address, String city,int tk,int phone,String email,int deptcode,int card,double hours,String cat,int orderno,double salary,Orders[] ord/*,double sales*/){
 super(  firstname, lastname, code,  address, city, tk, phone, email, deptcode, card, hours, cat );
 this.orderno=orderno;
 setBaseSalary( salary );

 //setGrossSales( sales );
 Orders[] order= ord.clone();//new Orders[orderno];//create the array for the orders made by this salesman
 //order=ord;
 setSallary(order );
 }



public void setSallary( Orders[] order ){
    //double sum=0;
    for(int i=0;i<=order.length;) {
       grossSales+=order[i++].getamount(); //get the value of the sales done
       System.out.println(grossSales);
    }
    if (grossSales<10000 ){

        baseSalary+=baseSalary*0.05;
    }
    else if((grossSales>=10000)||(grossSales<=20000)){
        baseSalary+=baseSalary*0.07;
    }
    else
        baseSalary+=baseSalary*0.1;


}

在主要我有

Orders[] array=new Orders[20];
   array[0]=new Orders(1,"14/5/2010","agora aftolinitwn",2000.0);
   array[1]=new Orders(2,"14/5/2010","agora aftolinitwn",20000.0);

   Salesman sales1 =new Salesman("giannis", "antoniou",35, "vavilonos 7", "leffkosia",11475,69486931,"gäntoniou@hotmail.com",100,40,160.0,"salesman",2,1300.0,array);
   Salesman sales2 =new Salesman("andreas", "antoniou",35, "vavilonos 7", "lefkosia",11475,69486931,"äntonioua@hotmail.com",100,41,160.0,"salesman",1,1200.0,array);

基本上我所做的是创建一个带有salsmans信息的数组(从销售中获得的金额等),然后将其发送给Saleman Constructor。然后我将tha阵列的锥体复制到另一个阵列,试图计算奖金。但是我得到了

  

线程“main”中的异常java.lang.NullPointerException

    at misthodosia.Salesman.setSallary(Salesman.java:36)
    at misthodosia.Salesman.<init>(Salesman.java:28)
    at misthodosia.Misthodosia.main(Misthodosia.java:30)

Java结果:1

继承了Orders类

public class Orders {
private int orderNo;
private String orderDate;
private String description;
private double orderAmount;
private Salesman man;


public Orders(int no,String date,String descrip,double amount/*,Salesman man*/){
    orderNo=no;
    orderDate=date;
    description=descrip;
    orderAmount=amount;
    //this.man=man;

    //Orders[] orders=new Orders[orderNo];//create the array for the orders made by this salesman



}


public double getamount(){
    return orderAmount;
}

}

你帮我吗?我知道我对对象数组做错了但我无法弄明白:S

4 个答案:

答案 0 :(得分:2)

就在这条线上:

grossSales + =顺序[I ++] getamount();

order数组的大小分配为20,但只有前2个被初始化,因此当它访问order [2] .getamount()时,该值为null,因此为空指针。

我强烈建议您使用ArrayList作为订单列表,而不必预先分配许多订单。

答案 1 :(得分:0)

for(int i=0;i<=order.length;)应为for(int i=0;i<order.length;)

此外,grossSales + = order [i ++]。getamount();从那以后,订单会失败[2] element为null。您应该使用集合来保存订单(例如ArrayList) 或在访问成员之前检查null。

答案 2 :(得分:0)

此代码:

Orders[] array=new Orders[20];
array[0]=new Orders(1,"14/5/2010","agora aftolinitwn",2000.0);
array[1]=new Orders(2,"14/5/2010","agora aftolinitwn",20000.0);

创建一个长度为20的数组,并仅初始化前两个条目,这意味着 其他18个enrties包含空指针。

使用此数组时,您可以:

for(int i=0;i<=order.length;) {
   grossSales+=order[i++].getamount(); //get the value of the sales done

这意味着索引2 order[i++]将为null,因此orders[i++].getAmount()会在您取消引用NUllPointerException值时生成null

答案 3 :(得分:0)

一般来说,为了找到像这样的空指针,我想做的是转到Exception堆栈跟踪指出的行(Salesman.java:36),检查你在该行上引用的对象,以及在该行之前为每个对象添加System.out.println()。其中一个必然会变成“空”。 然后从那里回溯,在这种情况下,你会发现(经过一些推理)杰克考克斯的答案。