System.NullReferenceException: „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.”

0

Witam. Podczas testowania aplikacji serwerowej napotkałem się na taki błąd:

"System.NullReferenceException: „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.” ".

Ferelna linijka to _room[Network.TempPlayer[index].Room]._state = Room.RoomState.Empty; na początku metody LeaveRoom(). Miał ktoś styczność z tego typu błędem?

Kod źródłowy klasy, w której występuje problem.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerApplicaton
{
    class RoomInstance
    {
        public static Room[] _room = new Room[100];
        public static RoomInstance instance = new RoomInstance();

        public void JoinOrCreateRoom(int index)
        {
            if (Network.TempPlayer[index].Room > 0)
            {
                Console.WriteLine("Player already in room");
                return;
            }

            int i = 0;

            for(i = 1; i < 100; i++)
            {
                if(_room[i]._state != Room.RoomState.Searching)
                {
                    if(_room[i]._state == Room.RoomState.Empty)
                    {
                        _room[i].player[0] = Network.Clients[index].Index;
                        _room[i]._state = Room.RoomState.Searching;
                        Network.TempPlayer[index].Room = i;
                        Console.WriteLine("Room created: " + i + " | Player added: " + " Index: " + index);
                        return;
                    }
                }
                else
                {
                    _room[i].player[1] = Network.Clients[index].Index;
                    _room[i]._state = Room.RoomState.Closed;
                    Network.TempPlayer[index].Room = i;
                    Console.WriteLine("Room joined: " + i + " |Player added: " + index);
                    ServerSendData.instance.SendMatchMaking(i);
                    return;
                }

            }
        }

        public void LeaveRoom(int index)
        {
            _room[Network.TempPlayer[index].Room]._state = Room.RoomState.Empty;
            if(_room[Network.TempPlayer[index].Room].player[0] == index)
            {
                _room[Network.TempPlayer[index].Room].player[0] = 0;
                ServerSendData.instance.SendIngame(_room[Network.TempPlayer[index].Room].player[1]);
            }
            else
            {
                _room[Network.TempPlayer[index].Room].player[1] = 0;
                ServerSendData.instance.SendIngame(_room[Network.TempPlayer[index].Room].player[0]);
            }
            Network.TempPlayer[index].Room = 0;
            Network.TempPlayer[index].Castbar = 0;
        }
    }

    class Room
    {
        public int roomIndex;
        public int[] player = new int[2];

        public RoomState _state;
        public enum RoomState
        {
            Empty,
            Searching,
            Closed
        }
    }
}

0

Próbujesz odwołać się do obiektu który nie istnieje.
Gdzie masz Network.TempPlayer i czy ta tablica istnieje gdy ten kod jest wykonywany?
Zobacz debugerem jaki jest problem.

0

Tablica istnieje. Jest utworzona na początku działania programu, w klasie Network.
namespace ServerApplicaton
{
class Network
{
public TcpListener ServerSocket;
public static Network instance = new Network();
public static Client[] Clients = new Client[100];
public static Player[] Player = new Player[100];
public static TempPlayer[] TempPlayer = new TempPlayer[100];```

Z wszystkiego wynikałoby, że ta tablica już istnieje.

Całkowite dane wejściowe:

„ServerApplicaton.exe” (CLR v4.0.30319: DefaultDomain): załadowano „C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
„ServerApplicaton.exe” (CLR v4.0.30319: DefaultDomain): załadowano „C:\Users\Zwolin\Desktop\Nowy folder\ServerApplicaton\bin\Debug\ServerApplicaton.exe”. Symbole zostały załadowane.
„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\Users\Zwolin\Desktop\Nowy folder\ServerApplicaton\bin\Debug\KaymakGames.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_pl_b77a5c561934e089\mscorlib.resources.dll”. Moduł został skompilowany bez symboli.
Zgłoszony wyjątek: „System.NullReferenceException” w ServerApplicaton.exe
Zgłoszony wyjątek: „System.NullReferenceException” w ServerApplicaton.exe
Wystąpił nieobsługiwany wyjątek typu „System.NullReferenceException” w ServerApplicaton.exe
Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

„ServerApplicaton.exe” (CLR v4.0.30319: ServerApplicaton.exe): załadowano „C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll”. Pominięto ładowanie symboli. Moduł jest zoptymalizowany i włączono opcję debugera „Tylko mój kod”.
Wątek 0x344c zakończył działanie z kodem 0 (0x0).
Program „[8636] ServerApplicaton.exe” zakończył działanie z kodem 0 (0x0).

0

No to teraz czy TempPlayer istnieje pod indeksem który podajesz?
Mówiąc "sprawdź debugerem" miałem na myśli ustawienie breakpoint'a na tej linii i zobaczenie co jest NULL'em w tej kolekcji.

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