簡體   English   中英

我需要使用JAVA編寫程序的幫助(nullpointer異常)

[英]I need help with a program ia m writing in JAVA ( nullpointer exception)

我想寫一個關於員工和其他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

它就在這條線上:

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

order數組的大小為20,但是只有前2個被初始化,因此,當它訪問order [2] .getamount()時,該值為null,因此為null指針。

我強烈建議對訂單列表使用ArrayList,而不必預先分配許多訂單。

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

此外,grossSales + = order [i ++]。getamount(); 由於該元素為null,因此對order [2]將失敗。 您應該使用集合來保存訂單(例如ArrayList)或在訪問成員之前檢查null。

這段代碼:

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 ,因此當您取消引用該null值時, orders[i++].getAmount()導致NUllPointerException

一般來說,為了找到像這樣的空指針,我想做的就是轉到Exception堆棧跟蹤指出的行(Salesman.java:36),檢查你在該行上引用的對象,然后在該行之前為每個對象添加一個System.out.println()。 其中之一勢必會變成“ null”。 然后從那里回溯,在這種情況下,您會發現(基於某種推理)上面的傑克·考克斯的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM