Avatar
hurvajs
Člen
Avatar
hurvajs:

Zdravím, při pokusu přidat data do třídy, mi vyskočí tato hláška...An unhandled exception of type 'System.NullRe­ferenceExcepti­on' occurred in Maturitni projekt.exe
Additional information: Odkaz na objekt není nastaven na instanci objektu.
Zde je kód window, kde při vytvoření nové zakázky chci, aby se zakázka přidala i do Listu v třídě zákazník, ale pořád mi to hází chybu...
Prosím o radu

public partial class NovaZakazka : Window
    {
        private static readonly IEvidenceZakazek repozitar = MainWindow.repozitar;
        public NovaZakazka()
        {
            InitializeComponent();
            MainWindow.repozitar.NactiDataZeSouboru();
        }

        private void BtnPridat_Click(object sender, RoutedEventArgs e)
        {
            int id = int.Parse(IdOdberatelTextBox.Text);


            PoznamkyTextBox.SelectAll();
            string poznamky = PoznamkyTextBox.Selection.Text;
            ZakazkaKatalog nova = new ZakazkaKatalog()
            {
                Odberatel = repozitar.ZiskatZakaznikaDleId(id),
                Id = IdZakazkyTextBox.Text,
                DatumPlneni = DateTime.Parse(DatumPlneniTextBox.Text),
                DatumVytvoreni = DateTime.Parse(DatumVytvoreniTextBox.Text),
                Zaloha = decimal.Parse(ZalohaTextBox.Text),
                Poznamka = poznamky,



            };

            Zakaznik upravovany = (Zakaznik)nova.Odberatel;
            upravovany.KatalogoveZakazky.Add(nova);
            repozitar.UpravZakaznika(upravovany);
            repozitar.PridatKatZakazku(nova);

            repozitar.UlozDataDoSouboru();
            this.Close();

        }
    }
}

zde je třída zákazník

public class Zakaznik
   {
       public int Id { get; set; }
       public string Jmeno { get; set; }
       public string Prijmeni { get; set; }
       public string Ulice { get; set; }
       public string Mesto { get; set; }
       public string Psc { get; set; }
       public string Telefon { get; set; }
       public string Email { get; set; }
       public string Ico { get; set; }
       public string Dic { get; set; }

       public List<Faktura> Faktury { get; set; }
       public List<ZakazkaKusova> KusoveZakazky { get; set; }
       public List<ZakazkaKatalog> KatalogoveZakazky { get; set; }

       public override string ToString()
       {
           return this.Jmeno + " " + this.Prijmeni;
       }
   }

popř. zde je link na celý program http://leteckaposta.cz/594657102

 
Odpovědět 14.3.2013 18:24
Avatar
Michal Žůrek (misaz):

Skoušel jsi debuger? Ten by ti řekl víc. Stejně tak s trochou angličtiny bys došel k tomu že cheš přidat něco do null a to zkrátka a dobře nejde.

KatologoveZakazky = null

Editováno 14.3.2013 19:11
Nahoru Odpovědět  +1 14.3.2013 19:10
Nesnáším {}, proto se jim vyhýbám.
Avatar
hurvajs
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
hurvajs:

Aha, tak to je teda "pěkný". A nevíš, jak by se to dalo vyřešit ?

 
Nahoru Odpovědět  +1 14.3.2013 19:45
Avatar
Odpovídá na hurvajs
Michal Žůrek (misaz):

před ten řádek kódu na kterém vzníka chyba dej:

upravovany.KatalogoveZakazky = new List<ZakazkaKatalog>();

Jakmile jsem to udělal, fungovalo mi to.

Nahoru Odpovědět 14.3.2013 19:59
Nesnáším {}, proto se jim vyhýbám.
Avatar
hurvajs
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
hurvajs:

Na to jak je to jednoduché, by mě to asi nikdy nenapadlo... Jinak samozřejmě jsem tvým dlužníkem.

 
Nahoru Odpovědět 14.3.2013 20:11
Avatar
Michal Žůrek (misaz):

:)
Já moc C# neumím (spíš mám radši VB.NET ale jsou si podobné), taky mi to celkem trvalo než jsem na to přišel.

Nahoru Odpovědět 14.3.2013 20:24
Nesnáším {}, proto se jim vyhýbám.
Avatar
hurvajs
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
hurvajs:

Ještě jsem to obalil do if

if (upravovany.KatalogoveZakazka !=null)
{upravovany.KatalogoveZakazky = new List<ZakazkaKatalog>();}
/code]
 
Nahoru Odpovědět 15.3.2013 8:21
Avatar
lcet.m
Člen
Avatar
Odpovídá na hurvajs
lcet.m:

Ještě jsem to obalil do if, aby to náhodou nefungovalo :)

1.) Žádná slušně vychovaná třída nezveřejňuje List s hodnotou null. Zvykni si inicializovat v konstruktoru

2.) Takhle vás to na nějaké škole učí? Zjevně je to WPF, tak proč to nepíšeš jako ve WPF? WPF není barevnější WinForm, jde tam o oddělelní UI a logiky.

 
Nahoru Odpovědět 15.3.2013 10:38
Avatar
Kit
Redaktor
Avatar
Odpovídá na hurvajs
Kit:

Ta třída Zakaznik je nějaká hubená. Bude mít někdy i nějaké metody?

Nahoru Odpovědět 15.3.2013 10:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
hurvajs
Člen
Avatar
Odpovídá na Kit
hurvajs:

Na metody mám repozitar +interface

 
Nahoru Odpovědět 15.3.2013 11:41
Avatar
Kit
Redaktor
Avatar
Odpovídá na hurvajs
Kit:

Aha, já si dávám do repozitářů raději celé třídy včetně metod. Snažím se mít co nejmenší rozhraní s okolím.

Nahoru Odpovědět 15.3.2013 12:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
hurvajs
Člen
Avatar
Odpovídá na lcet.m
hurvajs:

tak to if nefunguje.. :) ohledně toho učení, dva roky jsme se neučily => nový učitel a teď to bereme jen jako rychlokurz... A ohledně toho konstruktoru, to nevím jak udělat, kdyby si byl tak hodný a trochu mi to vysvětlil prosím.. :)

 
Nahoru Odpovědět 15.3.2013 14:59
Avatar
Kit
Redaktor
Avatar
Odpovídá na hurvajs
Kit:

Kdybys ten program napsal objektově, tak bychom se v tom možná vyznali, ale máš v tom příliš mnoho skrytých závislostí.

Nahoru Odpovědět 15.3.2013 15:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na hurvajs
Michal Žůrek (misaz):

V if bys musel dát místo operátoru != operátor ==
Tvoje:

Pokud se ... nerovná null, inicializuj to.

A správně:

Pokud se ... rovná null, inicializuj to.
Editováno 15.3.2013 15:17
Nahoru Odpovědět 15.3.2013 15:15
Nesnáším {}, proto se jim vyhýbám.
Avatar
lcet.m
Člen
Avatar
Odpovídá na hurvajs
lcet.m:

Zjednodušeně řečeno, konstruktor je metoda, která se volá při vytváření instance třídy. Tj. třída s property typu List<string> by měla vypadat nějak takhle:

public class Trida
{
   public List<string> Texty {get;set;}

   //a tohle je ten konstruktor:
   public Trida()
   {
      Texty = new List<string>();
   }

}

Když potom použiješ zápis

Trida t = new Trida();

To new Trida() je volání konstruktoru.

Nic ve zlém, ale pokud máš problém s konstruktory a podmínkami, nemá smysl pouštět se do ničeho dalšího. Učitel může být blbec (a často je), ale jestli si tohle nejseš schopen nastudovat sám, tak nemáš v tomhle oboru co dělat (protože jsem zahlédl něco o maturitní práci tak předpokládám, že studuješ programování).

 
Nahoru Odpovědět 15.3.2013 15:35
Avatar
hurvajs
Člen
Avatar
Odpovídá na lcet.m
hurvajs:

no programování přímo ne, studuji bohužel, ze zdravotních důvodů, Informatiku v ekonomice (informatika jen okrajově)..

 
Nahoru Odpovědět 15.3.2013 16:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.