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:
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ść
bad argument #1 to 'X' (number expected, got nil)Xto nazwa funkcji, która się poskarżyła.#1to pozycja argumentu:#1to pierwszy,#2to drugi.number expectedto typ, który funkcja potrzebuje. Może również mówićstring,tablelubboolean.got nilto to, co naprawdę otrzymała. Może byćgot table,got stringlubgot 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.
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:
bad argument #1 to 'insert' (table expected, got nil)local list
table.insert(list, 'a') -- list was never createdUtwórz tabelę, zanim jej użyjesz:
local list = {}
table.insert(list, 'a')Dla tabeli, która żyje w wspólnej strukturze, utwórz ją, gdy brakuje:
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:
bad argument #1 to 'for iterator' (table expected, got nil)for _, job in pairs(Config.Jobs) do -- Config.Jobs is nilSprawdzaj, 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ę:
for _, job in pairs(Config.Jobs or {}) doUż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).
local vehicle = GetVehiclePedIsIn(ped, false)
local plate = GetVehicleNumberPlateText(vehicle) -- vehicle is 0 when the ped is on footZwyczajne ź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ć:
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),GetClosestVehiclei 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żyjvector3, gdzie native przyjmuje jeden. - Brakujący klucz w config.
Config.Spawn.xjest nil, gdyConfig.Spawnjest 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ę:
if vehicle ~= 0 and DoesEntityExist(vehicle) then
SetVehicleEngineOn(vehicle, true, true, false)
endtostring, tonumber i string.format
Funkcje konwersji to inne źródła nil:
tonumber('abc')zwracanil, a nie błąd, więc awaria pojawia się później, gdy używasz wyniku.tostring(value)zawsze zwraca string, nawet dlanil(daje'nil'), więc jest bezpieczne użyć, gdy budujesz tekst.string.format('%d', value)zawala się, gdyvaluejestnil:bad argument #2 to 'format' (number expected, got nil).
Gdy liczba pochodzi od gracza lub z polecenia, sprawdzaj ją:
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:
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 →