bad argument #1 to 'X' (number expected, got nil): FiveM Lua düzelt
FiveM'de 'bad argument #1 to X (number expected, got nil)' alıyor musunuz? Argüman numarasını nasıl okuyacak ve nil entities, pairs(nil), tonumber ve table hatalarını nasıl düzeltilir.
Konsolunuzun bir yerinde, bir script bunu ile durur:
SCRIPT ERROR: @my_script/client/main.lua:57: bad argument #1 to 'floor' (number expected, got nil)Bir işlev, kullanamadığı bir argümanla çağrıldı ve argüman neredeyse her zaman nil. Mesaj hangi işlevi, hangi argümanı ve ne tür istediğini söyler. Bu kılavuz nasıl okuyacak ve nil'nin olağan kaynaklarını gösterir.
Mesajı nasıl oku
bad argument #1 to 'X' (number expected, got nil)Xşikayet eden işlevin adıdır.#1argümanın konumudur:#1ilki,#2ikinci.number expectedfonksiyonun ihtiyaç duyduğu tür. Ayrıcastring,tableveyabooleansöyleyebilir.got nilgerçekten aldığı şeydir. Ayrıcagot table,got stringveyagot no valueolabilir.
Hatadaki satırı açın ve mesajda adlandırılan işlevi arayın. Sonra bu konumdaki argümanı arayın ve nerede geldiğini sorun.
local price = Config.Prices[item]
local rounded = math.floor(price) -- bad argument #1 to 'floor' (number expected, got nil)Burada Config.Prices[item] nil, çünkü item tablonun anahtarı değil. Hata math.floor satırında, ama hata verinin içinde.
tablo bekleniyor, nil alındı
Aynı mesaj tablo ile table fonksiyonları ile görünür:
bad argument #1 to 'insert' (table expected, got nil)local list
table.insert(list, 'a') -- list was never createdKullanmadan önce tabloyu oluşturun:
local list = {}
table.insert(list, 'a')Paylaşılan yapıda yaşayan bir tablo için, eksik olduğunda oluşturun:
players[source] = players[source] or {}
table.insert(players[source], item)Nil üzerinde döngü: pairs ve ipairs
FiveM'in kullandığı Lua 5.3 ve 5.4'te, nil üzerinde döngü yapmak, pairs yerine döngü adlandıran bir mesaj ile başarısız olur:
bad argument #1 to 'for iterator' (table expected, got nil)for _, job in pairs(Config.Jobs) do -- Config.Jobs is nilTablonun nerede tanımlanacağını kontrol edin: adın yazım hatası, config dosyası manifesto tarafından yüklenmedi veya henüz gelmemiş veriler. Kısa bir koruma, gerçek nedeni bulurken çöküşü önler:
for _, job in pairs(Config.Jobs or {}) doBunu düzeltme olarak değil, güvenlik ağı olarak kullanın. Config.Jobs var olmalı sa, boş döngü sadece hata gizler. İlgili mesaj tablo indeksi nil iç içe config tablolarında eksik anahtarları kapsar.
Nil'i alan Native'ler
Birçok native bir sayı gerekir, örneğin bir entite handle. nil veya 0 olan handle genellikle entite (henüz) mevcut değildir anlamı.
local vehicle = GetVehiclePedIsIn(ped, false)
local plate = GetVehicleNumberPlateText(vehicle) -- vehicle is 0 when the ped is on footYaygın kaynaklar:
- Entite yüklü değil. Server tarafından spawn'lanan araç client'ınız için bir an için mevcut değildir. Client'ta, var olana kadar bekleyin:
local vehicle = NetToVeh(netId)
local timeout = 0
while not DoesEntityExist(vehicle) and timeout < 100 do
Wait(50)
vehicle = NetToVeh(netId)
timeout = timeout + 1
end- Bir fonksiyon hiçbir şey döndürmedi.
GetPlayerPed(-1),GetClosestVehicleve benzerileri hiçbir şey eşleşmediğinde0döndürebilir. Kullanmadan önce değeri kontrol edin. - Yanlış vektör. Üç sayı isteyen bir native,
x, y, z, bütün tabloyu kabul etmez.coords.x, coords.y, coords.zgeçirin veya native bir tane aldığındavector3kullanın. - Config'de eksik anahtar.
Config.Spawn.xnilConfig.Spawn[1],[2],[3]ile yazıldığında.
Kesin metin native'e bağlıdır ve bazı native'ler hiç bir hatayı yükseltmez ancak hiçbir şey yapmaz. Bu yüzden koruma eklemeye değer:
if vehicle ~= 0 and DoesEntityExist(vehicle) then
SetVehicleEngineOn(vehicle, true, true, false)
endtostring, tonumber ve string.format
Dönüşüm fonksiyonları nil'nin bir başka kaynağıdır:
tonumber('abc')hata vermeznildöndürür, bu yüzden çöküş daha sonra sonucu kullandığınızda gelir.tostring(value)her zaman string döndürür,niliçin bile ('nil'verir), bu yüzden metin oluşturduğunuzda güvenlidir.string.format('%d', value)valuenilolduğunda başarısız olur:bad argument #2 to 'format' (number expected, got nil).
Sayı player'dan veya komuttan geldiğinde kontrol edin:
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)args[1] oyuncu /pay tek yazarsa nil ve tonumber(nil) nil döndürür, bu yüzden yukarıdaki kontrol her iki durumu kapsar.
Nil'i bulun
Kaynak açık değilse, başarısız satırdan hemen önce değerleri yazdırın:
print('item', item, type(item))
print('price', Config.Prices[item], type(Config.Prices[item]))Sonra nil'i ayarlanmış olması gereken yere izleyin. Yapınca yazdırmaları kaldırın.
Kontrol listesi
| Belirti | Fix |
|---|---|
bad argument #1 to 'floor' (number expected, got nil) |
Değer eksik: onu besleyen anahtarı veya değişkeni kontrol edin |
bad argument #1 to 'insert' (table expected, got nil) |
Önce tabloyu oluşturun: t = t or {} |
bad argument #1 to 'for iterator' (table expected, got nil) |
Döngü yaptığınız tablo nil; adını ve nerede doldurulduğunu kontrol edin |
| Bir native bir entite üzerinde başarısız olur | DoesEntityExist(entity) kontrol edin ve entite yüklenmeyi bekleyin |
tonumber(...) nil verir |
Kullanmadan önce player girdisini doğrulayın |
bad argument #2 to 'format' |
%d ve %s gerçek değer gerekir; bu konumdaki argümanı kontrol edin |
Hata nil yerine kötü argüman hakkında ise, attempt to compare nil ve attempt to call a nil value okuyun.
Kısa yanıtlar
'bad argument #1 to X (number expected, got nil)' ne anlama geliyor?
Bir fonksiyon, bir sayı gerektirdiği yerde ilk argüman olarak nil aldı. X fonksiyonudur, #1 argümanın konumudur ve nil kodunuzun geçen şeydir.
'bad argument #1 to for iterator (table expected, got nil)' nasıl düzeltilir?
Bir değişkeni pairs veya ipairs ile nil olan bir değişkeni döngüye aldınız. Değişkenin doldurulduğu yeri bulun ve var olduğunu kontrol edin veya variable or {} öğesini döngüye alın.
Bir native nil hatasız alabilir mi?
Native'ye bağlı olarak, nil veya geçersiz değer 0 olarak işlenebilir veya sadece hiçbir şey yapmaz, böylece bug gizli kalabilir. Kullanmadan önce DoesEntityExist(entity) ile bir entiteyi kontrol edin.
Bu sorunu yaşatmayan scriptler
Advanced BoostingTabletten araç boosting: D’den S+ sınıfına kontratlar, ekipler ve canlı sıra.Scripti gör →
CCTV Security CamerasYerleştirilebilir kameralar, canlı çoklu görüntü tableti ve basılı delil fotoğrafları.Scripti gör →
Item Creator V2Animasyonlar, proplar, efektler ve daha fazlasıyla kullanılabilir eşyalar oluşturun — kod yazmadan.Scripti gör →