Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: slanecek 12. 04. 2012, 23:12:33

Název: java.lang.NullPointerException
Přispěvatel: slanecek 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?
Název: Re:java.lang.NullPointerException
Přispěvatel: Vena 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.
Název: Re:java.lang.NullPointerException
Přispěvatel: slanecek 12. 04. 2012, 23:36:23
Díky, už to funguje :)
Název: Re:java.lang.NullPointerException
Přispěvatel: Laci 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
Název: Re:java.lang.NullPointerException
Přispěvatel: Strasidlo 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.
Název: Re:java.lang.NullPointerException
Přispěvatel: yankee 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... `
Název: Re:java.lang.NullPointerException
Přispěvatel: DK 10. 08. 2012, 15:09:39
yankee: a neni to nahodou jenom na statickou promennou?
Název: Re:java.lang.NullPointerException
Přispěvatel: jeník 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
Název: Re:java.lang.NullPointerException
Přispěvatel: yankee 10. 08. 2012, 15:33:31
yankee: a neni to nahodou jenom na statickou promennou?

Ne-e... Si to vyzkousej.
Název: Re:java.lang.NullPointerException
Přispěvatel: yankee 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 :-)
Název: Re:java.lang.NullPointerException
Přispěvatel: Sten 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.
Název: Re:java.lang.NullPointerException
Přispěvatel: Laci 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