Forum zamknięte. Zapraszamy do grupy na Facebooku
Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Null Pointer Exception
12-03-2013, 11:47 PM (Ten post był ostatnio modyfikowany: 12-04-2013 12:17 AM przez Dunkoro.)
Post: #1
Null Pointer Exception
Mam na jutro skończyć ten program (notabene pisany w BlueJ, więc niezbyt zaawansowane) i nie rozumiem, co mam w tym programie napisane źle...
Kiedy próbuję wywołać dowolną metodę o zawierającą "tablicaPracownikow[j].pole", wyskakuje mi Null Pointer Exception Error.


Cytat:public class Pracownik
{
String nazwisko;
double dlugoscEtatu;
Pracownik tablicaPracownikow[]=new Pracownik[500];
String typPracownika;
double pensja;
int i=0;

public void wpiszUrzednika(String nazwisko, double dlugoscEtatu)
{
tablicaPracownikow[i]=new Urzednik(nazwisko, dlugoscEtatu);
i++;
this.i=i;
}

public void wpiszRobotnika(String nazwisko, double dlugoscEtatu)
{
tablicaPracownikow[i]=new Robotnik(nazwisko, dlugoscEtatu);
i++;
this.i=i;
}

public void obliczWyplate(){}

public Pracownik znajdzPracownika(String nazwisko)
{
int znalazlem=499;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].nazwisko==nazwisko)
znalazlem=j;
}

if(znalazlem!=0)
{return tablicaPracownikow[znalazlem];}
else
{return tablicaPracownikow[499];}
}

public void sprawdzenieCzyJestUrzednikiem(String nazwisko)
{
int znalazlem=499;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].nazwisko==nazwisko)
znalazlem=j;
}

if(tablicaPracownikow[znalazlem].typPracownika=="Urzednik")
{System.out.println("Ten Pracownik jest Urzednikiem");}
else
{
if(znalazlem==499)
{System.out.println("Taki Pracownik nie istnieje");}
else
{System.out.println("Ten Pracownik nie jest Urzednikiem");}
}
}

public void sprawdzenieCzyJestRobotnikiem(String nazwisko)
{
int znalazlem=499;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].nazwisko==nazwisko)
znalazlem=j;
}

if(tablicaPracownikow[znalazlem].typPracownika=="Robotnik")
{System.out.println("Ten Pracownik jest Robotnikiem");}
else
{
if(znalazlem==499)
{System.out.println("Taki Pracownik nie istnieje");}
else
{System.out.println("Ten Pracownik nie jest Robotnikiem");}
}
}

public void usunPracownika(String nazwisko)
{
int znalazlem=499;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].nazwisko==nazwisko)
znalazlem=j;
}
for(int j=znalazlem; j<tablicaPracownikow.length-1; j++)
{
tablicaPracownikow[j]=tablicaPracownikow[j+1];
}
}

public void policzUrzednikow()
{
int iloscUrzednikow=0;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].typPracownika=="Urzednik")
iloscUrzednikow++;
}
System.out.println("W tej firmie pracuje "+iloscUrzednikow+" Urzednikow");
}

public void policzRobotnikow()
{
int iloscRobotnikow=0;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].typPracownika=="Robotnik")
iloscRobotnikow++;
}
System.out.println("W tej firmie pracuje "+iloscRobotnikow+" Robotnikow");
}

public void sumaWyplatUrzednikow()
{
double suma=0;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].typPracownika=="Urzednik")
suma=suma+tablicaPracownikow[j].pensja;
}
System.out.println("Wszyscy Urzednicy w tej firmie zarabiaja w sumie "+suma);
}

public void sumaWyplatRobotnikow()
{
double suma=0;
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].typPracownika=="Robotnik")
suma=suma+tablicaPracownikow[j].pensja;
}
System.out.println("Wszyscy Robotnicy w tej firmie zarabiaja w sumie "+suma);
}

public void drukujListePracownikow()
{
System.out.println("Lista Pracownikow");
System.out.println("LP Nazwisko Grupa Etat");
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
System.out.println(j+" "+tablicaPracownikow[j].nazwisko+" "+tablicaPracownikow[j].typPracownika+" "+tablicaPracownikow[j].dlugoscEtatu);
}
}

public void drukujListeUrzednikow()
{
System.out.println("Lista Urzednikow");
System.out.println("LP Nazwisko Grupa Etat");
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].typPracownika=="Urzednik")
System.out.println(j+" "+tablicaPracownikow[j].nazwisko+" "+tablicaPracownikow[j].typPracownika+" "+tablicaPracownikow[j].dlugoscEtatu);
}
}

public void drukujListeRobotnikow()
{
System.out.println("Lista Robotnikow");
System.out.println("LP Nazwisko Grupa Etat");
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
if(tablicaPracownikow[j].typPracownika=="Robotnik")
System.out.println(j+" "+tablicaPracownikow[j].nazwisko+" "+tablicaPracownikow[j].typPracownika+" "+tablicaPracownikow[j].dlugoscEtatu);
}
}

public void drukujListePlac()
{
System.out.println("Lista Plac");
System.out.println("LP Nazwisko Grupa Etat Placa");
for(int j=0; j<tablicaPracownikow.length-1; j++)
{
obliczWyplate();
System.out.println(j+" "+tablicaPracownikow[j].nazwisko+" "+tablicaPracownikow[j].typPracownika+" "+tablicaPracownikow[j].dlugoscEtatu+" "+tablicaPracownikow[j].pensja);
}
}

}


Cytat:public class Urzednik extends Pracownik
{
String nazwisko;
double dlugoscEtatu;
double placaPodstawowa;
double placa;

public Urzednik(String nazwisko, double dlugoscEtatu)
{
this.nazwisko=nazwisko;
this.dlugoscEtatu=dlugoscEtatu;
typPracownika="Urzednik";
}

public double obliczWyplate(double premia)
{
placaPodstawowa=5000*dlugoscEtatu;
placa=placaPodstawowa*(1+premia);
System.out.println(placa);
return placa;
}
}


Cytat:public class Robotnik extends Pracownik
{
String nazwisko;
double dlugoscEtatu;
double stawkaGodzinowa=10;
double liczbaPrzepracowanychGodzin;
double limit;
double placa;

public Robotnik(String nazwisko, double dlugoscEtatu)
{
this.nazwisko=nazwisko;
this.dlugoscEtatu=dlugoscEtatu;
typPracownika="Robotnik";
}

public double wyplata(double liczbaPrzepracowanychGodzin, double stawkaGodzinowa)
{
limit=dlugoscEtatu*100;
if(liczbaPrzepracowanychGodzin>limit)
{placa=limit*stawkaGodzinowa+(liczbaPrzepracowanychGodzin-limit)*1.5*stawkaGodzinowa;}
else
{placa=liczbaPrzepracowanychGodzin*stawkaGodzinowa;}
return placa;
}
}
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
12-04-2013, 01:48 AM
Post: #2
RE: Null Pointer Exception
Dopiero sie ucze, ale widze to tak. Masz tablice 500 elementow, a pewnie tworzysz ich mniej dlatego sa tam odwolania null i to powoduje blad.
Nie wiem czy ladne ale mozesz np. dopisac w for-ach: "j<(tablicaPracownikow.length-1) && (tablicaPracownikow[j] != null);" jako dodatkowy warunek i wtedy bedzie dzialac.
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
12-04-2013, 08:40 AM
Post: #3
RE: Null Pointer Exception
(12-04-2013 01:48 AM)FireMorph napisał(a):  Dopiero sie ucze, ale widze to tak. Masz tablice 500 elementow, a pewnie tworzysz ich mniej dlatego sa tam odwolania null i to powoduje blad.
Nie wiem czy ladne ale mozesz np. dopisac w for-ach: "j<(tablicaPracownikow.length-1) && (tablicaPracownikow[j] != null);" jako dodatkowy warunek i wtedy bedzie dzialac.

Niestety, to nie rozwiązuje problemu.

Ja rozumiem ten błąd w ten sposób, że z jakiegoś powodu obiektom, które tworzę nie są przypisywane żadne parametry; kiedy próbuję korzystać z którejś z metod drukowania, to dostaję taki wynik:
0 null Robotnik 0.0
1 null Robotnik 0.0
2 null Urzednik 0.0
oraz java.lang.NullPointerException.

Czego nie rozumiem, to fakt, że moim obiekto nie są przypisywane żadne z parametrów które im podaję. Z tego wnioskuję, że coś jest nie tak w którymś z tych elementów:
Cytat:public void wpiszUrzednika(String nazwisko, double dlugoscEtatu)
{
tablicaPracownikow[i]=new Urzednik(nazwisko, dlugoscEtatu);
i++;
this.i=i;
}

public void wpiszRobotnika(String nazwisko, double dlugoscEtatu)
{
tablicaPracownikow[i]=new Robotnik(nazwisko, dlugoscEtatu);
i++;
this.i=i;
}
Cytat:public Urzednik(String nazwisko, double dlugoscEtatu)
{
this.nazwisko=nazwisko;
this.dlugoscEtatu=dlugoscEtatu;
typPracownika="Urzednik";
}
Cytat:public Robotnik(String nazwisko, double dlugoscEtatu)
{
this.nazwisko=nazwisko;
this.dlugoscEtatu=dlugoscEtatu;
typPracownika="Robotnik";
}
[/quote]
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
12-04-2013, 02:43 PM (Ten post był ostatnio modyfikowany: 12-04-2013 03:02 PM przez FireMorph.)
Post: #4
RE: Null Pointer Exception
Ten blad NullPointerException jest tak jak mowie dlatego ze masz tablice ale niezapisana w calosci elementami, a probujesz dostac/modyfikowac pola w ktorych jest null. W przykladzie, ktory podales wyswietla Ci trzy elementy. Zmien na moment wielkosc tablicy Pracownik[500] na Pracownik[3] i bledu juz nie bedzie jesli podasz ponownie tylko trzy elementy. Dlatego mozesz np tak jak wczesniej podalem sprawdzac za kazdym razem czy element jest null czy nie. Mozesz takze np zapisac od razu na poczatku cala tablice obiektami pracownik i pozniej przy niektorych metodach np drukujListePracownkow() dodac warunek ktory sprawdza czy nazwisko jest inne niz null(bo wtedy beda istniec pracownicy o pustych polach).
Teraz co do wypisywania pustych pol w Twoim przykladzie to dlatego ze masz zadeklarowane nowe skladowe w Urzedniku i Robotniku, a one nie sa potrzebne bo skoro rozszerzasz to te skladowe dziedziczysz juz z Pracownik. To troche przypomina przeciazanie i pewnie dlatego nie dziala.
Pomyslalem ze jeszcze dodam to dla info.
To ze wpisales Pracownik tablicaPracownikow[]=new Pracownik[500]; to jeszcze nie koniec. Stworzyles jedynie zmienna tablicaPracownikow typu Pracownik skladajaca sie z 500 elementow Pracownik. Teraz musisz wpisac jeszcze piecset razy razy Pracownik lub Urzednik lub Robotnik bo takie obiekty tam pasuja.
Czyli tablicaPracownikow[0] = new Pracownik();
tablicaPracownikow[1] = new Urzednik();
tablicaPracownikow[2] = new Robotnik();
tablicaPracownikow[3] = new Pracownik(); itd.
Inaczej System.out.println(tablicaPracownikow[4]); //wyswietli null
Mam nadzieje ze pomaga : ).
Znajdź wszystkie posty użytkownika
Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości