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:
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:
local cache = {}
local function remember(identifier, data)
cache[identifier] = data -- table index is nil when identifier is nil
endLua, 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ığındanildö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.idnil çünkü göndericidata.Idkullandı.
Emin olmak için yazdırın:
print('identifier', identifier, type(identifier))Sonra anahtar eksik olduğunda atamayı durdurun ve bunun bir hata mı yoksa normal bir durum mu karar verin:
local function remember(identifier, data)
if not identifier then
return print('remember: no identifier, skipping')
end
cache[identifier] = data
endattempt to index a nil value (field 'x')
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:
local first = Config.shops[1] -- Config.shops is nil, so [1] failsLua 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:
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:
print(Config)
print(Config.Shops)
print(Config.Shops[id])İç içe config tabloları
Bu hataların çoğu config dosyalarından geliyor:
Config = {}
Config.Shops = {
bar = { label = 'Bar', items = { 'beer', 'water' } },
}
-- somewhere else
local items = Config.Shops[shopName].itemsshopName 'bar' yerine 'Bar' sa, Config.Shops[shopName] nil ve sonraki .items çöker. Kontrol etmeye neden:
- Farklı yazım veya durum. Lua anahtarları büyük/küçük harfe duyarlı.
- Config dosyası yüklenmedi.
fxmanifest.luaiçindeshared_scripts(veya doğru taraf listesi) olmalı, öncesi onu okuyan dosya. - Config yalnızca bir tarafta tanımlanır.
server_scriptsaltında listelenen dosya client'a görünmez. - Dize anahtarına karşı sayısal anahtar.
Config.Shops[1]veConfig.Shops['1']farklı girişlerdir. Bu genellikle veri JSON aracılığıyla geçtikten sonra olur, FiveM json.decode errors bakın.
-- 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:
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:
local items = (shop and shop.items) or {}
local radius = Config.Radius or 5.0Sık derin yollar okursanız küçük bir yardımcı yapın:
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:
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 →