Мне нужна помощь с программой, я пишу в JAVA (исключение nullpointer) - PullRequest
0 голосов
/ 20 ноября 2010

Я пытаюсь написать программу, в которой о зарплатах сотрудников и других сотрудниках у меня есть абстрактный суперкласс под названием Employee, а затем следующие FullTimeEmployee, PartTimeEmployee, Orders и Salesman являются подклассами Employee.У меня только одна проблема с нулевыми указателями в Продавце, где я пытаюсь рассчитать бонус, который они получат за каждую продажу.

Вот мой код в классе Продавца

    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.Затем я копирую содержимое массива в другой массив, чтобы попытаться рассчитать бонус.но я получаю

Исключение в потоке "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 ]

2 голосов
/ 20 ноября 2010

В этой строке:

grossSales + = order [i ++]. Getamount ();

Массив заказов выделен размером 20, но инициализируются только первые 2поэтому, когда он обращается к order [2] .getamount (), это значение равно нулю, следовательно, указатель нуля.

Я настоятельно рекомендую использовать ArrayList для списка заказов, вам не нужно предварительно выделять числозаказов.

0 голосов
/ 20 ноября 2010

В общем, чтобы найти нулевые указатели, подобные этому, я хотел бы перейти к строке, на которую указывает трассировка стека исключений (Salesman.java:36), проверить, какие объекты вы ссылаетесь в этой строке, иперед этой строкой добавьте System.out.println () для каждого объекта.Один из них обязательно окажется «нулевым».Затем вернитесь назад, и в этом случае вы найдете (после некоторого рассуждения) ответ Джека Кокса выше.

0 голосов
/ 20 ноября 2010

Этот код:

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 и инициализирует только первые 2 записи, это означает, что другие 18 записей содержат нулевые указатели.

Когда вы используете этот массив, вы делаете:

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.

0 голосов
/ 20 ноября 2010

for(int i=0;i<=order.length;) должно быть for(int i=0;i<order.length;)

Кроме того, grossSales + = order [i ++]. Getamount ();потерпит неудачу для order [2], так как этот элемент имеет значение null.Вы должны использовать коллекцию для хранения заказов (например, ArrayList) или проверить наличие нулевых значений, прежде чем получить доступ к членам.

...