onsdag, maj 24, 2006

NullPointerException i Java

Tänkte dela med mig av en sak jag bråkade med ett tag, när jag höll på och arbeta med en inlämningsuppgift.
Java har inte så himla bra felmeddelanden alltid, inte för att andra språk har det heller, men man kan bli lite ställd ibland.

Somliga säger t ex att java inte har pekare, vilket inte är sant, det är bara så att du inte behöver hantera dem själv.

Angående NullPointerException error, så betyder det att du har försökt använda en referens som inte pekar till någonting. Det kan hända i alla möjliga slags situationer, men jag tänkte skriva om den vanligaste (och den jag fick bråka med).

Det hela handlar egentligen om "scope", och ett skrivfel som är mycket lätt hänt.

Se på följande kodexempel:

public class MinKlass {
private AndraKlassen klasstva;

public MinKlass() {
// Notera misstaget här
AndraKlassen klasstva = new AndraKlassen();
}

private void AndraEnGrej() {
klasstva.fixalite(21);
}
}

Misstaget här, handlar om att jag först definerar ett objekt som heter klasstva, men instansierar inte det, alltså att minne inte är reserverat för objektet ännu.
Det handlar bara om att meddela metoderna längre ner om att det finns ett sådant objekt.

Men när jag sen i constructen skriver 'AndraKlassen klasstva', då kommer jag göra samma sak en gång till, samt instansiera objektet.
Det innebär att jag har två objekt med samma namn, det ena instansierat och det ena tomt (null).

När metoden längre ner sedan försöker använda objektet, vilket ser det? Det instansierade eller det tomma?
Det tomma givetvis, eftersom den i en metod syns bara inom metoden. Och den var tom == NullPointerException.

Dethär är någonting som tål att tänkas på. Vilka objekt syns var, vilka variabler syns var. Blanda sedan ännu in static och non-static metoder och variabler, så blir det en riktig härva i huvudet om man är ny på dethär med objektorienterat.

Iaf för mig. ;-)

[edit:]
Felet heter "NullPointerException"! Borde ha kollat upp det först, minnet svek mig där.

1 kommentar:

Henrik Bjerkered sa...

Tack för tipset!
Har precis stött på detta mysteriska felmeddelande och det kan absolut relatera till det du tar upp här.