none
náhodná NullReferenceException

    Dotaz

  • Ahoj všem.

    Především, bych chtěl upozornit, že tohle snad není obvyklá začátečnická chyba tohoto ražení. V aplikaci C# se mi neočekávaně objevuje na dvou místech tato výjimka. Na tom by nebylo nic zvláštního pokud by to neprobíhalo tak, že stejná situace (rozuměj užití programu za stejných podmínek) tuto výjimku jednou vyvolá, pak 5x ne, pak zase ano, pak zase ne atp. Nevysledoval jsem žádnou souvislost s ničím.

    Nevíte někdo co s tím.

    pondělí 12. května 2014 17:58

Odpovědi

  • Ahoj, myslím, že chyba může vznikat tak, že se někdy nestihne inicializovat "proměnná", nebo něco takového a další metoda tak dostane zpět jen NULL a s tím neumí pracovat.

    Podobné věci řeším tak, že část kódu metody uzavřu do bloku podmínky, kdy řeknu, že vrácená hodnota nesmí být NULL. Kód tak musí počkat, až předchozí metoda ukončí úlohu a vrátí nějakou regulární hodnotu.

    Ke zdržení inicializace dochází poměrně často, způsobuje to třeba ověřování práv pro zápis nebo zjišťování systémových proměnných. Naučil jsem se ošetřovat to takto:

    if (navratovaHodnota != null)
    {
       ...
    }

    dk.


    • Upravený dk.Technology pátek 11. července 2014 22:49
    • Označen jako odpověď caci čtvrtek 17. července 2014 18:47
    pátek 11. července 2014 22:48

Všechny reakce

  • Spusť to v debuggeru (F5) a koukni, na kterém řádku to padlo. Pokud na to nepřijdeš analýzou kodu, postni to sem i s nějakým relavantním kusem kodu okolo.

    P.

    pondělí 26. května 2014 10:53
  • Proměnná není buď inicializovaná nebo je již naopak uvolněna. Bohužel bez kódu zde budeme věštit.
    středa 28. května 2014 15:28
  • public void InicializujPoleBoduuDiluAOtvoruu() { poleBoduuDilu = new Point[instEditovanehoDiluStrechy.

    seznamDelekStranDilu.Count]; seznamPoliiBoduuOtvoruu = new List<Point[]>(); }

    Na úvodním formu jsou tlačítka. Po klinutí na tlačítko se vytvoří nová instance DiluStrechy a ta se uloží do proměnné ve třídě. Kliknutím na tlačítko se otevře nový form a v tom dílu střechy si připraví poleBoduuDilu pro budoucí použití. No a zde se někdy (nyní se mi to povedlo vyvolat snad až na podvacáté klinutí) objeví, že instEditovanehoDiluStrechy je null. Kdybych to měl laicky popsat, přijde mi to, jako by se to nestihlo včas provést. Jako by se jednotlivé na sebe navazující příkazy vykonávali částečně souběžně a přitom se občas zapomnělo, že k pokračování je potřeba výsledek předchozícho.

    No a aby to bylo ještě zajímavější, tak na serveru 2008 se mi tuto chybu nepovedlo vyvolat nikdy. Na vistách dost často a na win7 s klesajícím výskytem v čase.

    Děkuji za zájem

    středa 28. května 2014 16:07
  • Tak hlavně před použitím Count by to chtělo otestovat existenci nenulového "seznamu", tím by se zamezilo havárii aplikace.

    Potom proč to nastává - hm, málo informací :-( Chtělo by to víc kódu okolo, chápu to tak, že se vytvoří pole, pak se vytvoří Form a někde v něm se s těmi daty pracuje ? Vytvoření Formu by mělo být synchronní, takže by se neměly jeho akce pustit dřív, než se vytvoří a pokud ho tvoříš až po té, co má být hotový "seznam", tak by to mělo chodit. Pebz více kódu to je ovšem věštění z křišťálové koule ...

    P.

    úterý 3. června 2014 10:55
  • private void button2_Click(object sender, EventArgs e) { Supervizor.instSupervizor.tlacitkoDilu = 2; Supervizor.instSupervizor.instStrecha.PridejDilStrechy();

    Vzor form = new Vzor(); form.ShowDialog(); }

            public void PridejDilStrechy()
            {
                Supervizor.instSupervizor.instEditovanehoDiluStrechy = new DilStrechy();
                Supervizor.instSupervizor.seznamJmenDiluu.Add("Díl střechy" + " " + (instSeznamuStresnichDilu.Count + 1));
                this.instSeznamuStresnichDilu.Add(new StrukturaStresniDil(Supervizor.instSupervizor.instEditovanehoDiluStrechy, Supervizor.instSupervizor.seznamJmenDiluu.Last()));}
    Obávám se, že zde není dost prostoru, abych sem vložil všechny potřebné informace. Bylo by to skutečně nepřehledné. Zde je ale patrné o jakou akci se jedná. Vždy o tu samou. Zmáčknu tlačítko, vytvoří se nová instance a uloží se do proměnné. Nic jiného nedělám než že otevírám a zavírám to samé okno pokaždé s novou instancí třídy DílStrechy. 20x se nic nestane a po 21. to zahlásí, že instEditovanehoDiluStrechy je null. Dám pokračovat, otevře se okno bez potřebných náležitostí. Zavřu, kliknu zas na stejné tlačítko a zase se 15x nic neděje. Tak nevím, myslel jsem jestli nemám něco špatně nastaveno ve visual studiu. Ale zaráží mne skutečnost, že na serveru 2008 se mi ještě nikdy tato chyba neobjevila. Tedy krom jiného.

    pátek 6. června 2014 16:17
  • Před pár dny jsem se dostal ke správě SBS 2007. A světe div se, při práci s mmc konzolami se mi dostávalo naprosto stejných výjimek. Zavřel jsem správu disku a poslední okno byla chybová hláška na null Reference. Tak je to asi normální, když to dělá i systémová součást. Nebo je snad ve Windows něco špatně?
    úterý 17. června 2014 20:18
  • Ahoj, myslím, že chyba může vznikat tak, že se někdy nestihne inicializovat "proměnná", nebo něco takového a další metoda tak dostane zpět jen NULL a s tím neumí pracovat.

    Podobné věci řeším tak, že část kódu metody uzavřu do bloku podmínky, kdy řeknu, že vrácená hodnota nesmí být NULL. Kód tak musí počkat, až předchozí metoda ukončí úlohu a vrátí nějakou regulární hodnotu.

    Ke zdržení inicializace dochází poměrně často, způsobuje to třeba ověřování práv pro zápis nebo zjišťování systémových proměnných. Naučil jsem se ošetřovat to takto:

    if (navratovaHodnota != null)
    {
       ...
    }

    dk.


    • Upravený dk.Technology pátek 11. července 2014 22:49
    • Označen jako odpověď caci čtvrtek 17. července 2014 18:47
    pátek 11. července 2014 22:48
  • Popravdě jsem se této odpovědi obával. Ale nepřekvapila mne. Moc děkuji.
    čtvrtek 17. července 2014 18:50