2010-11-20 22 views
0

Çalışanların ve diğer staaffların ödemeleri ile ilgili bir program yazmaya çalışıyorum, Employee adlı bir soyut süper sınıfım var, ve o zaman aşağıdaki FullTimeEmployee, PartTimeEmployee , Siparişler ve Satıcı, Çalışanın alt sınıflarıdır. Her satış için alacağı bonusu hesaplamaya çalıştığım Salesman'daki boş göstericilerle ilgili bir sorunum var. Burada JAVA (nullpointer istisnası) ile çalışan bir programda yardıma ihtiyacım var

i

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ä[email protected]",100,40,160.0,"salesman",2,1300.0,array); 
    Salesman sales2 =new Salesman("andreas", "antoniou",35, "vavilonos 7", "lefkosia",11475,69486931,"ä[email protected]",100,41,160.0,"salesman",1,1200.0,array); 

sahip ana içinde

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; 


} 

Satıcı sınıfta benim kodudur temelde ben o zaman salsmans bilgi (vb satışından elde tutar) ve bir dizi yaratıyor ne Saleman Yapıcısına yollamak. Daha sonra bono dizisini başka bir diziye kopyalayıp bonusu dengelemek için deneyin. ama "ana" java.lang.NullPointerException dizisindeki

İstisna olsun

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

Java Sonuç: heres 1

Siparişleri sınıf yanı

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; 
} 

Yardımcı olabilir misin? Ben nesne dizisi ile yanlış bir şey yapıyorum biliyorum ama çözemiyorum: S

+0

Salesman.java' 36 hattında hangi kod var? –

+0

'order.length' doğru olarak 1 değerine ayarlandı mı? – steabert

+0

Her şeyden önce cevaplarınız için hepinize teşekkür ederim. Ben kullanıcı dizi listesi diyelim, bu satırı nasıl dönüştürüyorum grossSales + = order [i ++]. Getamount(); dizi listesiyle çalışmak için? Listedeki her öğe için bu değeri almam gerekiyor? – George

cevap

2

Bu hat üzerinde:

grossSales + = Sipariş [i ++] getamount();

Sipariş dizisi, 20 boyutuna ayrılmıştır, ancak yalnızca ilk 2 başlatılır, bu nedenle [2] .getamount() öğesine eriştiğinde, değer sıfırdır, dolayısıyla boş gösterici olur.

Sipariş listesi için bir ArrayList kullanılmasını şiddetle öneriyorum, bir takım siparişleri önceden tahsis etmeniz gerekmez.

0

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

Ayrıca

, grossSales + = düzen [i ++] getamount() olmalıdır;. öğesinin boş olması nedeniyle [2] siparişi için başarısız olur. Siparişleri (örn. ArrayList) tutmak için bir koleksiyon kullanmalı veya üyelere erişmeden önce boş olup olmadığını kontrol etmelisiniz. .

0

Bu kod:

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); 

uzunluğu 20 ve başlatır bir dizi oluşturur, sadece ilk 2 girişleri, bu diğer 18 enrties boş işaretçiler içeren anlamına gelir.Bu dizi kullandığınızda

yapmanız:

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

endeksinde 2 order[i++] bir NUllPointerException içinde null ve bu nedenle orders[i++].getAmount() sonuç olacağı anlamına gelir ne zaman o null değeri KQUEUE.

0

Genel olarak, bu gibi boş göstericileri bulmak için, yapmak istediklerim Exception stack trace noktalarını işaret eder (Salesman.java:36), o satırda başvuruda bulunduğunuz nesnelere bakın, ve bu satırdan önce her nesne için bir System.out.println() ekleyin. Bunlardan biri "boş" olarak açılmak zorunda. Ardından oradan geri dönün ve bu durumda Jack Cox'un yukarıdaki cevabı bulabilirsin.

+0

Her şeyden önce cevaplarınız için hepinize teşekkür ederim. Dizi listesi kullandığımı söyleyelim, bu satırı nasıl dönüştürüyorum grossSales + = order [i ++]. Getamount(); dizi listesiyle çalışmak için? satıcının nihai maaşını hesaplayabilmem için listedeki her bir öğe için (farklı bir siparişi temsil eden) bu değeri (miktar) almam gerekir. – George

İlgili konular