attempt to index a nil value
Bir script bir bilginin hazır olmasını bekledi ve o henüz orada değildi, o yüzden durdu.
Önce şunu yap
Mesajın adlandırdığı script'i ve dosyayı not et, sonra framework'ünden önce başlayıp başlamadığını kontrol et.
Ne anlama gelir
Bir şey, nil olan bir değişkende . ya da [] operatörünü kullandı. Lua'da a.b yalnızca a bir tabloyken geçerlidir; a nil olduğunda script o satırda durur. Mesaj genelde neyin nil olduğunu adlandırır: (field 'PlayerData'), (global 'ESX'), (local 'data'), (upvalue 'Config').
Parantez içindeki o ad mesajın en kullanışlı kısmıdır, ve her tür başka bir yeri gösterir:
• global 'X' — hiç atanmamış, ya da çalışmamış bir dosyada atanmış.
• field 'X' — tablo var ama öyle bir anahtarı yok.
• local 'X' / upvalue 'X' — bu dosyada atanmış, ama bu satır çalışmadan önce değil.
Neden olur
Ne sıklıkla doğru cevap olduğuna göre sıralı.
- 1
Framework nesnesi henüz yüklenmemiş (istemcide en yaygını)
Bir istemci dosyası
ESX,QBCoreya daPlayerDatayı dosya kapsamında ya da erken bir thread'de, framework oyuncu nesnesini devretmeden önce okuyor. Kaynağın, framework oyuncuyu yüklemeyi bitirmeden önce başlıyor. - 2
Var olmayan bir config anahtarı
Config.Somethingın hiç tanımlanmadığı, yeniden adlandırıldığı ya da fxmanifest'te listelenmemiş bir dosyada olduğuConfig.Something.value. - 3
Sunucu nil gönderdi
Bir istemci olay işleyicisi, sunucunun geçtiği bir tabloyu indeksliyor, ve bazı yollarda sunucu hiçbir şey geçmemiş. Yüksüz
TriggerClientEvent('x', src)işleyiciye nil verir. - 4
Bir sarmalayıcı hiçbir şey döndürmedi
Native'ler tablo döndürmez, ama birinin etrafındaki bir yardımcı, geçersiz bir varlık için nil döndürebilir, ve çağıran onu indeksler.
- 5
Yükleme sırası
Tabloyu tanımlayan dosya, fxmanifest'te onu kullanan dosyadan SONRA listelenmiş, yani kullanıldığı anda henüz yok.
Hangisinin seninki olduğu nasıl anlaşılır
Başarısız olan satırın hemen üstünde, alanı değil kapsayıcıyı yazdır:
print(json.encode(Config.Something))
null yazıyorsa sorun kapsayıcıdır ve alan yanıltıcıdır. Parantez içindeki ad bir framework global'i ise, bir bekleme ekle ve hatanın yer değiştirip değiştirmediğine bak: bir zamanlama sorunu kaybolur, eksik bir anahtar kaybolmaz.
Nereye bakmalı
Yığından dosyayı ve satırı aç. Yalnızca noktadan önceki kısmı değil, ifadenin tamamını oku: a.b.c.d içinde a, a.b ya da a.b.cden herhangi biri nil olabilir, ve parantez içindeki ad sana hangisi olduğunu söyler.
Nasıl düzeltilir
Framework zamanlaması için nesneyi asla dosya kapsamında okuma:
local PlayerData = {}
RegisterNetEvent('esx:playerLoaded', function(xPlayer)
PlayerData = xPlayer
end)
-- başlangıç sırasında gerçekten gerekiyorsa:
CreateThread(function()
while not ESX or not ESX.IsPlayerLoaded() do Wait(100) end
-- buradan sonrası güvenli
end)Geri kalan her şey için indekslemeden önce koru:
local entry = Config.Jobs[job] if not entry then return end
Hâlâ kendi kodunda mı takıldın?
Bu sayfa, bu hatanın genelde ne anlama geldiğini anlatır. Konsolunu Server Fixer'a yapıştır; içindeki her şeyi sıraya dizer ve önce ne yapman gerektiğini söyler. Kendin uğraşmak istemiyorsan ORBIE script'i onarır ve kaynağı sunucuna atmaya hazır geri verir.
bug_reportServer Fixer'ı açBu tür bir hata için Script Optimizer script'i okur ve bunun arkasındaki kodu onarır.
Bununla birlikte gelen hatalar
- attempt to call a nil value
- PlayerData boş ya da henüz yüklenmemiş
- Framework nesnesi nil (ESX / QBCore)
- cannot resume dead coroutine
- SCRIPT ERROR in citizen:/scripting/lua/scheduler.lua
- attempt to index a number, boolean or string value
- attempt to yield across a C-call boundary
- stack overflow
- table index is nil