java.lang.NullPointerException

java.lang.NullPointerException
« kdy: 12. 04. 2012, 23:12:33 »
Ahoj,

učím se programovat v Javě skrze „modrou knížku“ od Pecinovského a někde kolem strany 100 na mě vyskočila chyba java.lang.NullPointerException, viz screen. Podle knihy by vše mělo být v pořádku, ale není. Nevíte někdo?
« Poslední změna: 12. 04. 2012, 23:22:47 od Petr Krčmář »


Vena

Re:java.lang.NullPointerException
« Odpověď #1 kdy: 12. 04. 2012, 23:31:44 »
Neco mi rika, ze 34. a 35. radek by mel vypadat takto:
this.koruna = new Elipsa(...);
this.kmen = new Obdelnik(...);

Na misto tech tecek patri ty parametry ktere tam mas.
NullPointerException ti to vyhazuje, protoze do atributu koruna neni prirazen zadny objekt.

Re:java.lang.NullPointerException
« Odpověď #2 kdy: 12. 04. 2012, 23:36:23 »
Díky, už to funguje :)

Laci

Re:java.lang.NullPointerException
« Odpověď #3 kdy: 10. 08. 2012, 13:24:44 »
Kód: [Vybrat]
this.koruna = new Elipsa(...);
Kód: [Vybrat]
this.kmen = new Obdelnik(...);
Prečo tam je to kľúčové slovo this? Mne to funguje aj bez neho napr.
koruna = new Elipsa(...);

-tiež sa učím Javu

Strasidlo

Re:java.lang.NullPointerException
« Odpověď #4 kdy: 10. 08. 2012, 13:35:16 »
Toto klicove slovo (this) ti umozni se odkazat na tu instanci te tridy - tj. pokud budes v argumentu metody shodne nazvy objektu, tak skrze this se jednoznacne odkazes na konkretni objekty te instance tridy

Kód: [Vybrat]
...
MyClass bla;

void method(MyClass bla){
     this.bla=bla;
}
...

Timto jednoznacne odlisis, ktere "bla" je ktere.


yankee

Re:java.lang.NullPointerException
« Odpověď #5 kdy: 10. 08. 2012, 14:24:13 »
Toto klicove slovo (this) ti umozni se odkazat na tu instanci te tridy - tj. pokud budes v argumentu metody shodne nazvy objektu, tak skrze this se jednoznacne odkazes na konkretni objekty te instance tridy

Kód: [Vybrat]
...
MyClass bla;

void method(MyClass bla){
     this.bla=bla;
}
...

Timto jednoznacne odlisis, ktere "bla" je ktere.

To mas pravdu, ale spousta lidi cpe this pred kazdej pristup ke clensky prommeny a za to bych vrazdil. Ale treba takova Vala to snad i vynucuje :-) Kazdopadne v C++ lze pouzit NazevTridy::clenska_promenna a zbavis se dereference... `

DK

Re:java.lang.NullPointerException
« Odpověď #6 kdy: 10. 08. 2012, 15:09:39 »
yankee: a neni to nahodou jenom na statickou promennou?

jeník

Re:java.lang.NullPointerException
« Odpověď #7 kdy: 10. 08. 2012, 15:19:36 »
To mas pravdu, ale spousta lidi cpe this pred kazdej pristup ke clensky prommeny a za to bych vrazdil. Ale treba takova Vala to snad i vynucuje :-) Kazdopadne v C++ lze pouzit NazevTridy::clenska_promenna a zbavis se dereference... `
Protože napíšeš this. a našeptávač už ti tam vypíše ty proměnné :D

yankee

Re:java.lang.NullPointerException
« Odpověď #8 kdy: 10. 08. 2012, 15:33:31 »
yankee: a neni to nahodou jenom na statickou promennou?

Ne-e... Si to vyzkousej.

yankee

Re:java.lang.NullPointerException
« Odpověď #9 kdy: 10. 08. 2012, 15:35:11 »
To mas pravdu, ale spousta lidi cpe this pred kazdej pristup ke clensky prommeny a za to bych vrazdil. Ale treba takova Vala to snad i vynucuje :-) Kazdopadne v C++ lze pouzit NazevTridy::clenska_promenna a zbavis se dereference... `
Protože napíšeš this. a našeptávač už ti tam vypíše ty proměnné :D

:-) To uz bych spis preferoval treba m_ prefix :-)

Sten

Re:java.lang.NullPointerException
« Odpověď #10 kdy: 10. 08. 2012, 15:46:30 »
To mas pravdu, ale spousta lidi cpe this pred kazdej pristup ke clensky prommeny a za to bych vrazdil. Ale treba takova Vala to snad i vynucuje :-) Kazdopadne v C++ lze pouzit NazevTridy::clenska_promenna a zbavis se dereference... `

To dělám třeba já, protože to pomáhá se orientovat, jestli je to lokální nebo členská proměnná, tedy jestli to umře na konci funkce nebo ne.

Jak se zbavíte dereference? To, že ji tam nenapíšete, neznamená, že ji kompilátor stejně neprovede.

Laci

Re:java.lang.NullPointerException
« Odpověď #11 kdy: 15. 08. 2012, 14:19:58 »
Keď tu niekto idete podľa tej knižky alebo ste pracovali v BlueJ mohli by ste mi helfnúť s týmto problémom.
Snažím sa naprogramovať testovaciu metodu k metode zarámuj. Problém je, že ma to nejako neposlúcha.

 
Kód: [Vybrat]
@Test
    public void zaramuj()
    {
        P.zprava("Následuje odlíšenie stromov.\nKoruny: červená - strom1, modrá - strom2, biela - strom3.");
        strom1.setBarvaKoruny(Barva.CERVENA);
        strom2.setBarvaKoruny(Barva.MODRA);
        strom3.setBarvaKoruny(Barva.BILA);
        P.zprava("Následuje zarámovanie strom1."); //metodu zarámovanie prikladám nižšie
        strom1.zaramuj();
        assertEquals(true, P.souhlas("Bol strom1 zarámovaný?\nNásleduje zarámovanie strom2."));
        strom2.zaramuj();
        assertEquals(true, P.souhlas("Bol strom2 zarámovaný?\nNásleduje zarámovanie strom3."));
        strom3.zaramuj();
        P.zprava("Následuje pôvodný stav.");
        Platno.getPlatno().setRozmer(300, 300);
        strom1.nakresli();
        strom2.nakresli();
        strom3.nakresli();
    }

No a metoda triedy strom je podľa knihy:

Kód: [Vybrat]
void zaramuj()
    {
        Platno.getPlatno().setRozmer(getSirka(), getVyska() );
        setPozice(0, 0);
    }

-najprv mením farby korún stromov, aby bolo aj vykonávatelovi testu jasné, že sa vždy testuje iný strom
-potom rámujem každý strom čo spočíva v (zmazanie a zmenenie plochy platna na rozmer inštancie, nastavenie pozície stromu na (0,0), každý strom je tvorený iným konštruktorom na inej pozícii
-nakonci chcem nastaviť platno opäť na 300x300 a nakreslit stromy ako na začiatku, pri čom im môžem zmeniť aj farby spat, ked budem robit dalsi test, nech môže prebehnut