table index is nil / index a nil value (field): FiveM Lua düzelt

FiveM Lua'da 'table index is nil' ve 'attempt to index a nil value (field x)' düzelt: eksik config anahtarları, t[nil] atamalar, iç içe tablolar ve güvenli erişim desenleri.

İki hata ki benziyor her zaman FiveM script'lerinde ortaya çıkıyor:

text
SCRIPT ERROR: @my_script/server/main.lua:42: table index is nil
SCRIPT ERROR: @my_script/client/main.lua:19: attempt to index a nil value (field 'shops')

Farklı anlamlar. İlki nil anahtar hakkında, ikinci nil tablo hakkında. Her ikisi de kodunuzun beklediği ve bulmadığı bir değere geliyor. Bu kılavuz onları ayırt etme ve erişimi çökmeyecek şekilde yazma yolunu gösterir.

table index is nil

Bir tabloya atadınız ve anahtar nil idi:

lua
local cache = {}

local function remember(identifier, data)
    cache[identifier] = data     -- table index is nil when identifier is nil
end

Lua, nil dışında herhangi bir değeri anahtar olarak izin verir (ve NaN). cache[nil] okuması sadece nil verir, ancak yazma hata yükseltir.

Parantez arasında nil olan hangi değişkenin o satırda olduğunu bulun. Olağan kaynaklar:

  • Hiçbir şey döndüren bir oyuncu araması. GetPlayerIdentifierByType(source, 'license') oyuncu, örneğin oyuncu beklenen platform aracılığıyla bağlı olmadığında bu tür bir identifier'a sahip olmadığında nil döndürür.
  • Yanlış source. Server'da, olayın gerçekten bir oyuncudan geldiğini kontrol edin. Konsoldan bir çağrı arkasında hiçbir oyuncu yok.
  • Verilerde eksik alan: data.id nil çünkü gönderici data.Id kullandı.

Emin olmak için yazdırın:

lua
print('identifier', identifier, type(identifier))

Sonra anahtar eksik olduğunda atamayı durdurun ve bunun bir hata mı yoksa normal bir durum mu karar verin:

lua
local function remember(identifier, data)
    if not identifier then
        return print('remember: no identifier, skipping')
    end
    cache[identifier] = data
end

attempt to index a nil value (field 'x')

text
attempt to index a nil value (field 'shops')

Burada tablo eksik. Parantez içindeki ad, nil olan alandır ve onu dizine aldığınız şey satırda:

lua
local first = Config.shops[1]    -- Config.shops is nil, so [1] fails

Lua bildiği isim. Göreceğiniz birkaç form:

Mesaj Anlam
(global 'Config') Global değişken Config nil
(local 'data') Yerel değişken nil, genellikle fonksiyon argümanı
(field 'shops') Config.shops nil
(field '?') Config.Shops[id] gibi değişken anahtarı tarafından bulunan tablo nil
(upvalue 'cache') Dış kapsamdan bir değişken nil

field '?' için, Lua hesaplandığı için anahtarı adlandıramaz:

lua
Config.Shops[id].label          -- attempt to index a nil value (field '?')

Düzeltme aynı: zincirin hangi adımının nil olduğunu bulun. Her adımı yazdırın:

lua
print(Config)
print(Config.Shops)
print(Config.Shops[id])

İç içe config tabloları

Bu hataların çoğu config dosyalarından geliyor:

lua
Config = {}
Config.Shops = {
    bar = { label = 'Bar', items = { 'beer', 'water' } },
}

-- somewhere else
local items = Config.Shops[shopName].items

shopName 'bar' yerine 'Bar' sa, Config.Shops[shopName] nil ve sonraki .items çöker. Kontrol etmeye neden:

  1. Farklı yazım veya durum. Lua anahtarları büyük/küçük harfe duyarlı.
  2. Config dosyası yüklenmedi. fxmanifest.lua içinde shared_scripts (veya doğru taraf listesi) olmalı, öncesi onu okuyan dosya.
  3. Config yalnızca bir tarafta tanımlanır. server_scripts altında listelenen dosya client'a görünmez.
  4. Dize anahtarına karşı sayısal anahtar. Config.Shops[1] ve Config.Shops['1'] farklı girişlerdir. Bu genellikle veri JSON aracılığıyla geçtikten sonra olur, FiveM json.decode errors bakın.
lua
-- fxmanifest.lua
shared_scripts { 'config.lua' }
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }

Güvenli erişim desenleri

Eksik değer normal bir durum olduğunda, erişimi işleyecek şekilde yazın.

Her adımı and ile kontrol edin:

lua
local shop = Config.Shops and Config.Shops[shopName]
if not shop then
    return print(('Unknown shop: %s'):format(tostring(shopName)))
end
print(shop.label)

Varsayılan için or kullanın:

lua
local items = (shop and shop.items) or {}
local radius = Config.Radius or 5.0

Sık derin yollar okursanız küçük bir yardımcı yapın:

lua
local function get(t, ...)
    for _, key in ipairs({ ... }) do
        if type(t) ~= 'table' then return nil end
        t = t[key]
    end
    return t
end

local label = get(Config, 'Shops', shopName, 'label')

Dikkat: her nil'i or {} ile gizlemeyin. Var olması gereken bir tablo eksikse, bu config veya yük sırası bir hatadır ve sessiz fallback sadece hatayı daha az belirgin yerde hareket ettirir. Meşru olarak eksik olabilecek değerler için koruma kullanın.

Bir tabloyu içinde ne olduğunu görmek için döküm

Bir tablo ne tuttuğundan emin değilseniz, JSON olarak yazdırın:

lua
print(json.encode(Config.Shops, { indent = true }))

Gerçek anahtarları göreceksiniz ve yazım hatası, farklı durum veya string beklediğiniz yerde bir sayı nokta. Dosyanın en üstünde değil, hatanın olduğu noktada yapın, çünkü veriler daha sonra doldurulabilir.

Kontrol listesi

Belirti Fix
table index is nil t[key] = value içindeki anahtar nil; yazdırın ve eksikse erken dönün
attempt to index a nil value (field 'shops') Adlandırılan alan, önce tabloda ayarlanmadı; adı ve yazım kontrol edin
attempt to index a nil value (field '?') Değişken anahtarla bir araştırma hiçbir şey bulamadı; anahtarı ve çalışmasını kontrol edin
Server'da çalışır, client'ta nil Config shared_scripts içinde değil
Config dosyası yoksayıldı Kullanan dosyalardan önce listeleyin
Sayı anahtarı vs string anahtarı [1] ve ['1'] farklı; tonumber veya tostring ile dönüştürün

Diğer yaygın nil mesajları için, attempt to compare nil ve bad argument errors bakın.

Kısa yanıtlar

'table index is nil' ne anlama geliyor?

Script, nil bir tablo olarak anahtarı olarak kullanmaya çalıştı, örneğin key nil olduğunda t[key] = value. Lua, nil bir anahtar olarak izin vermez, bu yüzden durur.

'table index is nil' ve 'attempt to index a nil value' arasındaki fark nedir?

'table index is nil' de anahtar nil. 'attempt to index a nil value' de tablo kendisi nil, bu yüzden okumak veya yazmak için hiçbir şey yok.

Hata alan '?' yerine bir ad söylediğinde neden?

Anahtar bir değişken olduğunda Config.Shops[id] gibi, Lua onu adlandıramaz. ? gösterir. Satıra bakın ve zincirin hangi bölümünün nil olduğunu bulun.

Bu sorunu yaşatmayan scriptler

Shop CreatorBir dakikadan kısa sürede dükkân kurun — sahipler, çalışanlar, kasalar ve soygunlar dahil.Scripti gör →Quest CreatorGörevler ve NPC diyalogları için oyun içinde düğüm düğüm kurulan görsel editör.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