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:

text
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

text
bad argument #1 to 'X' (number expected, got nil)
  • X şikayet eden işlevin adıdır.
  • #1 argümanın konumudur: #1 ilki, #2 ikinci.
  • number expected fonksiyonun ihtiyaç duyduğu tür. Ayrıca string, table veya boolean söyleyebilir.
  • got nil gerçekten aldığı şeydir. Ayrıca got table, got string veya got no value olabilir.

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.

lua
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:

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

Kullanmadan önce tabloyu oluşturun:

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

Paylaşılan yapıda yaşayan bir tablo için, eksik olduğunda oluşturun:

lua
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:

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

Tablonun 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:

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

Bunu 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ı.

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

Yaygı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:
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
  • Bir fonksiyon hiçbir şey döndürmedi. GetPlayerPed(-1), GetClosestVehicle ve benzerileri hiçbir şey eşleşmediğinde 0 dö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.z geçirin veya native bir tane aldığında vector3 kullanın.
  • Config'de eksik anahtar. Config.Spawn.x nil Config.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:

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

tostring, tonumber ve string.format

Dönüşüm fonksiyonları nil'nin bir başka kaynağıdır:

  • tonumber('abc') hata vermez nil döndürür, bu yüzden çöküş daha sonra sonucu kullandığınızda gelir.
  • tostring(value) her zaman string döndürür, nil için bile ('nil' verir), bu yüzden metin oluşturduğunuzda güvenlidir.
  • string.format('%d', value) value nil olduğunda başarısız olur: bad argument #2 to 'format' (number expected, got nil).

Sayı player'dan veya komuttan geldiğinde kontrol edin:

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)

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:

lua
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 →

Okumaya devam edin