[C#] Problem z new (instancje na obiekt)

0

Witam.
Co może być przyczyną tego, że wciąż dostaję komunikat -> Object reference not set to an instance of an object. Obiekt został utworzony (metoda new ) oraz nie jest on równy NULL.

Macie może jakieś pomysły ?

PdR

0

Czytaj ze zrozumieniem ;)

Wklej kod z linią w której występuje błąd

0

Rozróżniaj pojęcia obiekt i referencja. Obiekt nie może być NULL, tylko referencja. To, że obiekt jest utworzony to nie znaczy, że masz poprawnie do niego referencję zapisaną. Poza tym pewnie chodzi o zupełnie inną referencję niż myślisz (tylko przypuszczam, to jedyne co mogę zrobić gdyż kodu nie dałeś).

Ech, kolejny post w stylu "wszystko mam dobrze, ale nie działa" bez grama kodu. I jak my mamy ci pomóc, skoro wiemy tylko tyle, że masz wszystko dobrze ;)

0

okej, dzięki za rady z cyklu "wszystko działa ale nie działa" , będę pamiętał o tym ;] Co do kodu , to w sumie stworzyłem obiekt klasy i chciałem się do niejgo odwołać:

KLASA_JAKAS obiekt = new KLASA_JAKAS();

(...)

obiekt.zmienna_1 = wartość;

Dosłownie tak to wygląda, zapisałem używając nazewnictwa ogólnego. Mi to wydaje się całkowicie poprawnie, ale jeszcze "Raczkuje" więc mogę się mylić :)

PdR

0

To co powyżej jest ok. Daj wreszcie kod który powoduje problem jeśli mamy ci pomóc.

0

To jest ten kod, z nim jest jakiś problem:

SetProductIaI.paramsType param = new SetProducts.SetProductIaI.paramsType();
                          
                
                prod[a].id = Int32.Parse(Nkod.Value.ToString()); .. tutaj wywala się... a=1
0

Albo prod[a] albo NKod albo NKod.Value jest null'em. Po wyskoczeniu wyjątku, jak najedziesz myszką na poszczególne zmienne/pola to w chmurce podglądniesz ich wartości (jeśli używasz VC#).

Btw, jakiego typu jest NKod.Value ? Bo zamienisz najpier na łańcuch i z łańcucha na liczbę [???] Użyj Convert.ToInt32()

0

oh, przypadkow moze byc wiecej :D
moze jeszcze byc tablica/kolekcja prod null albo nawet Nkod.Value i w tedy metoda ToString() wywolana na null sie posypie

a szczerze mowiac to z kodu ktory podales to jak ma sie obiekt param do prod, czy prod[a]

czy param jest jednym z obiektow w kolekcji prod[a]? jesli tak moze wklej wiecej kodu, moze masz zle robione przypisanie lub jakas inne operacja cos nadpisuje

inaczej adf88 bedzie mial racje w 3 poscie :)

0

Właśnie, jeszcze o samej kolekcji prod zapomniałem. Sprawdź wszystkie.

massther napisał(a)

moze masz zle robione przypisanie lub jakas inne operacja cos nadpisuje
to by się debugger zatrzymał się w jej środku (no chyba, że z jakiejś zewnętrznej biblioteki korzystasz to wtedy ona może mieć bug'a).

0

wczesniej wkradł się błąd. Chodzi mi tylko o relacje prod[a].id = jakiś_int. Prod[a] jest obiektem klasy productType[] , jest to zewnętrzna klasa, pobrana z serwera (programuje web services).

Zmienna id jest zmienną klasy productType[]; Więcej kodu nie ma sensu zamieszczać, bo już na tym etapie wyskakuje to "nie lubiane" przeze mnie okienko error ;] Być może nie można deklarować obiektu w ten sposób: ...productType[1]; ??

SetProductIaI.productType[] prod = new SetProducts.SetProductIaI.productType[1];
prod[a].id = jakis_int;

Co do konwersji, to jakoś polubiłem metodę Int32.Parse(string); Zmienna id ma być int.A Nkod.value to numericUPDOWN, więc zmienna typu decimal.

0

Tablice indeksuje się od zera ! Czyli a musi być równe 0. Popraw to.
I dostałeś na pewno "Object reference not set to an instance of an object", czy może coś w stylu "Argument out of range." ?
Jeśli "Object ..." to otwórz sobie okienko z watch'ami (Debug->Windows->Watch) i dodaj na listę:

  • prod
  • prod[a]
  • Nkod
    to zobaczysz który jest null'em (żaden z nich nie może być).
    Możesz też jak pisałem wcześniej najechać myszką na zmienną/pole klasy w kodzie w tej linijce z błędem i poczekać aż wyświetli się chmurka która pokaże zawartość.

Polub też tą metodę ;) :

prod[a].id = Convert.ToInt32(Nkod.Value);
0

hmmm a czy wiesz ze tablice w c# numeruje sie od zero a nie od jeden!!!

wiec jesli object[] o = new object[1];
to:
o[0] = cos_tam; // OK
o[1] = cos_tam; // zle
(bo wczesniej pisales ze a=1)

poza tym to ze utworzyles tablice, nie znaczy ze utworzyles obiekty!!!
czyli po twojej 1 linijce masz miejsce na jeden obiekt typu productType, ale prod[0] nie jest referencja do obiektu, musisz jeszcze dodac prod[a] = new productType();

trzeba bylo od razu dac wiecej kodu i mialbys odp. w kilka minut :P

eh, nie zaladowal mi sie post adf88, wiec sie troche powtorzylem

podkresle raz jeszcze - stworzenie tablicy to nie to samo co stworzenie jej wszystkich obiektow!!!

0

hmmm a czy wiesz ze tablice w c# numeruje sie od zero a nie od jeden!!!

Oczywiście że wiem i mam od 0numeracje, nie wiem dlaczego napisałem 1, widocznie za dużo mętlik w głowie. Oczywiście w programie jest od 0. A co do wskazówek, to zaraz będę próbował.
Sprawdziłem to. Faktycznie jest null.
Po deklaracji

SetProductIaI.productType[] prod = new SetProducts.SetProductIaI.productType[10];
 prod[0].id = Convert.ToInt32(Nkod.Value);  // polubiłem metodę - krótsza ;p 

Po sprawdzeniu w "podglądaczu" pokazało
Prod
-[0] = null
-[1] = null
(..)
-[10] = null.
Czyli nie wypełniło obiektu klasy. Dlaczego ?

podkresle raz jeszcze - stworzenie tablicy to nie to samo co stworzenie jej wszystkich obiektow!!!

Dzięki :)

PdR

0

To jest tablica referencji do obiektów (domyślna wartość dla referencji to null), a nie samych obiektów. Obiekty muszą być stworzone oddzielnie, a referencje do nich zapisane w tablicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1