THE ORB
Uruchamiam studio

attempt to index a nil value

Skrypt oczekiwał, że jakaś informacja będzie gotowa, a jej jeszcze nie było, więc się zatrzymał.

groupsTa funkcja przestaje działaćcodePotrzebny programista

Zrób najpierw to

Zanotuj, który skrypt i plik wymienia komunikat, a potem sprawdź, czy nie wystartował przed twoim frameworkiem.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Coś użyło operatora . albo [] na zmiennej, która jest nil. W Lua a.b jest legalne tylko wtedy, gdy a jest tablicą; kiedy a jest nil, skrypt zatrzymuje się na tej linii. Komunikat zwykle nazywa to, co było nil: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').

Ta nazwa w nawiasie to najbardziej przydatna część komunikatu, a każdy jej rodzaj wskazuje gdzie indziej:

global 'X' — nigdy nieprzypisana albo przypisana w pliku, który się nie wykonał.

field 'X' — tablica istnieje, ale nie ma takiego klucza.

local 'X' / upvalue 'X' — przypisana w tym pliku, ale nie przed wykonaniem tej linii.

Co to powoduje

Uszeregowane według tego, jak często są odpowiedzią.

  1. 1

    Obiekt frameworka jeszcze się nie wczytał (najczęstsze po stronie klienta)

    Plik kliencki czyta ESX, QBCore albo PlayerData w zasięgu pliku albo we wczesnym wątku, zanim framework przekazał obiekt gracza. Twój zasób startuje, zanim framework skończy wczytywać gracza.

  2. 2

    Klucz konfiguracji, który nie istnieje

    Config.Something.value, gdzie Config.Something nigdy nie zostało zdefiniowane, zmieniło nazwę albo leży w pliku, którego nie ma w fxmanifeście.

  3. 3

    Serwer wysłał nil

    Handler zdarzenia klienckiego indeksuje tablicę przekazaną przez serwer, a na którejś ścieżce serwer nie przekazał nic. TriggerClientEvent('x', src) bez danych daje handlerowi nil.

  4. 4

    Opakowanie nic nie zwróciło

    Funkcje natywne nie zwracają tablic, ale pomocnik wokół jednej z nich może zwrócić nil dla niepoprawnej encji, a wołający to indeksuje.

  5. 5

    Kolejność ładowania

    Plik definiujący tablicę jest w fxmanifeście wymieniony PO pliku, który jej używa, więc w momencie użycia jeszcze jej nie ma.

Jak poznać, który jest twój

Wypisz kontener, nie pole, bezpośrednio nad wadliwą linią:

print(json.encode(Config.Something))

Jeśli wypisze null, problemem jest kontener, a pole to fałszywy trop. Jeśli nazwa w nawiasie to globalna frameworka, dodaj czekanie i zobacz, czy błąd się przesunie: problem z czasem znika, brakujący klucz nie.

Gdzie szukać

Otwórz plik i linię ze stosu. Przeczytaj całą instrukcję, nie tylko część przed kropką: w a.b.c.d nilem może być którekolwiek z a, a.b albo a.b.c, a nazwa w nawiasie mówi, które.

Jak to naprawić

Przy problemach z czasem we frameworku nigdy nie czytaj obiektu w zasięgu pliku:

local PlayerData = {}

RegisterNetEvent('esx:playerLoaded', function(xPlayer)
    PlayerData = xPlayer
end)

-- kiedy naprawdę potrzebujesz go przy starcie:
CreateThread(function()
    while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
    -- od tego miejsca bezpiecznie
end)

W pozostałych przypadkach zabezpiecz się przed indeksowaniem:

local entry = Config.Jobs[job]
if not entry then return end

Wciąż utknąłeś na własnym kodzie?

Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.

bug_reportOtwórz Server Fixer

Dla tego rodzaju błędu Script Optimizer czyta skrypt i naprawia kod stojący za tym.

Błędy, które chodzą z tym w parze