Nejde poslat objekt – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nejde poslat objekt – .NET – Fórum – Programujte.comNejde poslat objekt – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Tukan0
Stálý člen
11. 5. 2012   #1
-
0
-

Zdravím, 

mám jeden problém v projektu do školy. Nejde mi přijmout objekt poslaný metodou. Objekt je vytáhnutý deserializací ze souboru. Když dáte v projektu hra -> nahrát a vyberete zkouska.save, hodí to chybu v souboru Hra.cs na řádku 76 - Object reference not set to an instance of an object. Když si ale vyvolám MessageBox, tak mi to normálně vyhodí data z načteného souboru (LoadGame.cs, 31). Někdo nějaký nápad proč metoda předá nulový objekt?

přidávám projekt http://www.edisk.cz/stahni/55602/mravenci.rar_1.42MB.html

Nahlásit jako SPAM
IP: 188.175.56.–
Reklama
Reklama
11. 5. 2012   #2
-
0
-

#1 Tukan
Spíš přilož problémovej zdrojovej kód.

Nahlásit jako SPAM
IP: 91.217.52.–
Dušan Janošík | web: djanosik.cz, @djanosik
ingiraxo+15
Grafoman
11. 5. 2012   #3
-
0
-

Nebo si to zkus debugnout a tam, kde to vyhodi error se postupně vracej a zjistíš problém

hlavně si myslim, že serializace a deserializace objektu není moc ideální když se jedná o hru.. je lepší použít klasickej binární zápis

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tukan0
Stálý člen
11. 5. 2012   #4
-
0
-

tak tady je část kodu z Hra.cs 

public Hra GiveGame()
        {
            return lg.GiveGame(); //tady hází chybu Object reference not set to an instance of an object

        }

a tady je celá třída LoadGame

class LoadGame
    {
        Hra lHra;

        /// <summary>
        /// Konstruktor pro načtění souboru
        /// </summary>
        public LoadGame(String nazev)
        {
            IFormatter lFormatter = new BinaryFormatter();
            Stream lStream = new FileStream(nazev, FileMode.Open);
            lHra = null;
            try
            {
                lHra = (Hra)lFormatter.Deserialize(lStream);
                MessageBox.Show(lHra.rightCastle.ToString()); // normálně vypíše data z souboru takže je to dobře načtené
            }
            finally
            {
                lStream.Close();
            }
        }


        /// <summary>
        /// Vrací hru
        /// </summary>
        public Hra GiveGame()
        {
            return lHra;
        }
    }
Nahlásit jako SPAM
IP: 188.175.56.–
ingiraxo+15
Grafoman
11. 5. 2012   #5
-
0
-

pokud deserializace proběhla úspěšně a po skončení funkce je objekt zas null, tak ho musíš alokovat při deserializaci

hlavně nechápu, proč na tohle mas třídu.. tohle vše ma být v té třídě Hra

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
11. 5. 2012   #6
-
0
-

#4 Tukan
Dobře, to znamená, že ta proměnná lg je null. S deserializací to nemá co dělat. Tedy za předpokladu, že ta výjimka opravdu vzniká na uvedeném řádku a ne na předcházejícím.

Nahlásit jako SPAM
IP: 91.217.52.–
Dušan Janošík | web: djanosik.cz, @djanosik
ingiraxo+15
Grafoman
12. 5. 2012   #7
-
0
-

on je hlavně problém, že to máš nepochopitelně ve 2 třídách, celá třída LoadGame má být ve třídě Hra a ta funkce LoadGame může vrace třeba objekt Hra... nevim proč máš proměnnou lg pro třídu LoadGame kde je podstatě jen konstruktor

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Tukan0
Stálý člen
12. 5. 2012   #8
-
0
-

tak jsem tedy to načítání vrátil zpět do Hra.cs a už mi objekt jde poslat. Stále mám však ten stejný problém. Ve Form1.cs (kde mám Gui) mám kód: 

hra = hra2.GiveGame();
MessageBox.Show(hra2.rightCastle.ToString()); // funguje

a zde můžu normálně přečíst hra2. Nechápu proč se mi však hra2 nepřiřadí do hra. 

hra = hra2.GiveGame();
MessageBox.Show(hra.rightCastle.ToString()); // tady to vyhodí chybu null

Jaktože mi jeden objekt nejde přiřadit druhému?

Nahlásit jako SPAM
IP: 188.175.56.–
Tukan0
Stálý člen
12. 5. 2012   #9
-
0
-

samozřejmě jsem tam původně měl  

hra = hra.GiveGame();

ale na příkladu výše to jde lépe vidět kde mám chybu

Nahlásit jako SPAM
IP: 188.175.56.–
Řešení
liborb
~ Redaktor
+18
Guru
14. 5. 2012   #10
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

Když se dívám do toho tvého kódu, tak vidím toto:

hra = new Hra(openFileDialog1.FileName);
hra = new Hra();
hra = hra.GiveGame();

v tom prvním řádku tvoříš instanci Hra, kde se v konstruktoru inicializuje i proměnná lg. Následně znovu vytvoříš instanci Hra do stejné proměnné (tj. o předchozí přijdeš) a to implicitním konstruktorem, takže lg zůstane null. No a pak voláš GiveGame, kde přistoupíš k tomu nulovému lg. Takže stačí ten 2. řádek vykomentovat.

Nejspíš už je chyba jinde, ale bude asi podobného ražení.

Nahlásit jako SPAM
IP: 78.80.52.–
Tukan0
Stálý člen
15. 5. 2012   #11
-
0
-

#10 liborb
díky moc, bylo to tím. Ostatním samozřejmě taky díky za snahu mi pomoci.

Nahlásit jako SPAM
IP: 188.175.56.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 33 hostů

Podobná vlákna

Poslat mail — založil xeonikx

Muze obrazek poslat cookie? — založil Jan Bednar

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý