bad argument #1 to 'X' (number expected, got nil): naprawa Lua FiveM

Otrzymujesz 'bad argument #1 to X (number expected, got nil)' w FiveM? Jak przeczytać numer argumentu i naprawić nil encje, pairs(nil), tonumber i błędy tabeli.

Gdzieś w twojej konsoli skrypt zatrzymuje się z tym:

text
SCRIPT ERROR: @my_script/client/main.lua:57: bad argument #1 to 'floor' (number expected, got nil)

Funkcja została wezwana z argumentem, którego nie może używać, a argument to prawie zawsze nil. Wiadomość mówi ci, która funkcja, który argument i jaki typ chciała. Ten przewodnik pokazuje, jak go przeczytać i zwyczajne źródła nil.

Jak przeczytać wiadomość

text
bad argument #1 to 'X' (number expected, got nil)
  • X to nazwa funkcji, która się poskarżyła.
  • #1 to pozycja argumentu: #1 to pierwszy, #2 to drugi.
  • number expected to typ, który funkcja potrzebuje. Może również mówić string, table lub boolean.
  • got nil to to, co naprawdę otrzymała. Może być got table, got string lub got no value.

Otwórz linię z błędu i poszukaj funkcji wymienionej w wiadomości. Następnie spójrz na argument w tej pozycji i zapytaj, skąd to pochodzi.

lua
local price = Config.Prices[item]
local rounded = math.floor(price)   -- bad argument #1 to 'floor' (number expected, got nil)

Tutaj Config.Prices[item] jest nil, ponieważ item nie jest kluczem tabeli. Błąd jest na linii math.floor, ale błąd jest w danych.

table expected, got nil

Ta sama wiadomość z tabelą pojawia się z funkcjami table:

text
bad argument #1 to 'insert' (table expected, got nil)
lua
local list
table.insert(list, 'a')     -- list was never created

Utwórz tabelę, zanim jej użyjesz:

lua
local list = {}
table.insert(list, 'a')

Dla tabeli, która żyje w wspólnej strukturze, utwórz ją, gdy brakuje:

lua
players[source] = players[source] or {}
table.insert(players[source], item)

Pętla nad nil: pairs i ipairs

W Lua 5.3 i 5.4, które FiveM używa, pętla nad nil zawala się z wiadomością, która wymienia pętlę zamiast pairs:

text
bad argument #1 to 'for iterator' (table expected, got nil)
lua
for _, job in pairs(Config.Jobs) do   -- Config.Jobs is nil

Sprawdzaj, gdzie tabela jest zdefiniowana: literówka w nazwie, plik config nie załadowany przez manifest, lub dane, które nie przybyły jeszcze. Krótka osłona unika awarii, gdy znajdziesz prawdziwą przyczynę:

lua
for _, job in pairs(Config.Jobs or {}) do

Używaj tego jako sieci bezpieczeństwa, a nie jako naprawę. Jeśli Config.Jobs powinno istnieć, pusta pętla tylko ukrywa błąd. Powiązana wiadomość table index is nil obejmuje brakujące klucze w zagnieżdżonych tabelach config.

Natives, które otrzymują nil

Wiele natives potrzebuje liczby, takie jak uchwyt encji. Uchwyt, który jest nil lub 0, zwykle oznacza, że encja nie istnieje (jeszcze).

lua
local vehicle = GetVehiclePedIsIn(ped, false)
local plate = GetVehicleNumberPlateText(vehicle)   -- vehicle is 0 when the ped is on foot

Zwyczajne źródła:

  • Encja nie jest załadowana. Pojazd spawniętny przez serwer nie jest dostępny dla twojego klienta na moment. Na kliencie czekaj, aż będzie istnieć:
lua
local vehicle = NetToVeh(netId)
local timeout = 0
while not DoesEntityExist(vehicle) and timeout < 100 do
    Wait(50)
    vehicle = NetToVeh(netId)
    timeout = timeout + 1
end
  • Funkcja nic nie zwróciła. GetPlayerPed(-1), GetClosestVehicle i podobne mogą zwrócić 0, gdy nic się nie zgadza. Sprawdzaj wartość, zanim jej użyjesz.
  • Zły wektor. Native, który chce trzy liczby, x, y, z, nie akceptuje całej tabeli. Przekaż coords.x, coords.y, coords.z, lub użyj vector3, gdzie native przyjmuje jeden.
  • Brakujący klucz w config. Config.Spawn.x jest nil, gdy Config.Spawn jest napisane z [1], [2], [3].

Dokładny tekst zależy od native, a niektóre natives nie podnoszą błędu w ogóle, ale nic nie robią. Dlatego warto dodać osłonę:

lua
if vehicle ~= 0 and DoesEntityExist(vehicle) then
    SetVehicleEngineOn(vehicle, true, true, false)
end

tostring, tonumber i string.format

Funkcje konwersji to inne źródła nil:

  • tonumber('abc') zwraca nil, a nie błąd, więc awaria pojawia się później, gdy używasz wyniku.
  • tostring(value) zawsze zwraca string, nawet dla nil (daje 'nil'), więc jest bezpieczne użyć, gdy budujesz tekst.
  • string.format('%d', value) zawala się, gdy value jest nil: bad argument #2 to 'format' (number expected, got nil).

Gdy liczba pochodzi od gracza lub z polecenia, sprawdzaj ją:

lua
RegisterCommand('pay', function(source, args)
    local amount = tonumber(args[1])
    if not amount then
        return print('Usage: /pay [amount]')
    end
    print(('Paying %d'):format(amount))
end)

Zanotuj args[1] to nil, gdy gracz wpisał /pay sam, a tonumber(nil) zwraca nil, więc powyższa kontrola obejmuje oba przypadki.

Znajdź nil

Gdy źródło nie jest oczywiste, wydrukuj wartości zaraz przed linią niepowodzenia:

lua
print('item', item, type(item))
print('price', Config.Prices[item], type(Config.Prices[item]))

Następnie śledź nil wstecz do miejsca, gdzie powinno być ustawione. Usuń wydruki, gdy skończysz.

Lista kontrolna

Objaw Naprawa
bad argument #1 to 'floor' (number expected, got nil) Brakuje wartości: sprawdzaj klucz lub zmienną, która ją dostarcza
bad argument #1 to 'insert' (table expected, got nil) Utwórz tabelę najpierw: t = t or {}
bad argument #1 to 'for iterator' (table expected, got nil) Tabela, nad którą pęteliasz, to nil; sprawdzaj jej nazwę i gdzie jest wypełniana
Native zawala się na encji Sprawdzaj DoesEntityExist(entity) i czekaj na załadowanie encji
tonumber(...) daje nil Waliduj dane wejściowe gracza przed ich użyciem
bad argument #2 to 'format' %d i %s potrzebują rzeczywistej wartości; sprawdzaj argument w tej pozycji

Jeśli błąd dotyczy czegoś, czego brakuje, zamiast złego argumentu, przeczytaj attempt to compare nil i attempt to call a nil value.

Szybkie odpowiedzi

Co oznacza 'bad argument #1 to X (number expected, got nil)'?

Funkcja otrzymała nil jako swój pierwszy argument, gdzie potrzebuje liczby. X to funkcja, #1 to pozycja argumentu, a nil to to, co przeszedł twój kod.

Jak naprawić 'bad argument #1 to for iterator (table expected, got nil)'?

Pęteliłeś zmienną, która jest nil, za pomocą pairs lub ipairs. Znajdź, gdzie ta zmienna jest wypełniana i sprawdzaj, czy istnieje, lub pętli nad variable or {}.

Czy native może otrzymać nil bez błędu?

W zależności od native, wartość nil lub nieprawidłowa może być traktowana jako 0 lub po prostu nic robić, więc błąd może się ukrywać. Sprawdzaj encję za pomocą DoesEntityExist(entity) przed jej użyciem.

Skrypty bez tego problemu

Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →CCTV Security CamerasKamery do rozstawienia, tablet z podglądem wielu kamer na żywo i drukowane zdjęcia jako dowody.Zobacz skrypt →Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →

Czytaj dalej