attempt to call a nil value (field, global, method): nasıl düzeltilir
FiveM'de 'attempt to call a nil value' alıyor musunuz? Alan, global ve method varyantları ne anlama geliyor ve yazım hatasını, eksik export'u veya iki nokta-nokta hatasını nasıl düzeltilir.
Konsolda:
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to call a nil value (field 'GetPlayerFromId')
SCRIPT ERROR: @my_script/client/main.lua:17: attempt to call a nil value (global 'DrawText3D')
SCRIPT ERROR: @my_script/client/main.lua:63: attempt to call a nil value (method 'Notify')Lua, bir satırın mevcut olmayan bir işlevi çalıştırmaya çalıştığını söylüyor. Bu makale üç varyantı, olağan nedenleri ve her birini nasıl düzeltilir açıklar.
Hata ne demek
Lua'da eksik ad kendi başına hata değildir: okumak nil verir. Hata yalnızca sonra parantez koyduğunuzda görünür, çünkü nil çalıştıramazsınız. Parantez içindeki metin, script'in eksik işleve nasıl ulaştığını söyler:
attempt to call a nil value (global 'X'):X()gibi çıplak çağrı. Fonksiyon script'in görebildiği yerde tanımlanmamıştır.attempt to call a nil value (field 'X'):ESX.X()veyaQBCore.Functions.X()gibi tablo aracılığıyla çağrı. Tablo var, amaXadlı giriş yoktur.attempt to call a nil value (method 'X'):obj:X()gibi iki nokta ile çağrı. Nesne var, amaXyöntemi yok.
Mesajın ön tarafındaki dosya ve satır (@my_script/server/main.lua:42) çağrı yapan satırdır. Çıktının geri kalanını nasıl okuyacağınızdan emin değilseniz, FiveM script hatasını nasıl okuyacak bakın.
1. Adda yazım hatası
Lua büyük/küçük harf duyarlıdır. GetPlayerFromId ve getPlayerFromId iki farklı ad ve TriggerClientEvent ve TriggerclientEvent de. Hatadaki adı çerçeve belgelerine kıyasla harf harf karşılaştırın.
2. Fonksiyon sürümünde mevcut değildir
Çerçeveler fonksiyonları yeniden adlandırır ve kaldırırlar. Bu, çerçevenizin başka bir sürümü için yazılmış script'lerin en yaygın nedenidir.
-- an old call that may be gone on your version
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.getInventoryItem('bread')Çerçevenizin gerçekten ne sunduğunu kontrol edin. Girişlerini görmek için tabloyu yazdırın:
for name, value in pairs(ESX) do
print(name, type(value))
endİhtiyacınız olan fonksiyon listede değilse, script ve çerçeve eşleşmez. Çerçeveyi güncelleyin, script'i güncelleyin veya çağrıyı sürümünüzün sahip olduğu biyle değiştirin.
3. Export eksik
Exports, başka bir resource'un sağladığı fonksiyonlardır. Resource durdurulduğunda, başlamadığında veya bu adı export etmediğinde çağrı başarısız olur.
local core = exports['qb-core']:GetCoreObject()
core.Functions.GetPlayer(source)Resource çalışmıyorsa, FiveM bunun yerine No such export yazdırır. Çalışırsa ancak export adı yanlış ise, nil alanıyla sonuçlanabilirsiniz. Kaynağı önce server.cfg içinde başlatın ve belgelerinde veya fxmanifest.lua üzerinde tam export adlarını kontrol edin. İki ilgili düzeltme: ESX nil ve No such export getSharedObject.
4. Iki nokta vs nokta
Iki nokta nesneyi gizli ilk argüman olarak geçer. Nokta değil. Karıştırmak ya bu hatayı ya da yanlış argümanları verir.
-- calls the method with the object as first argument
player:Notify('hello')
-- calls a plain function stored in a table
Utils.Notify('hello')Hata (method 'Notify') söylerse, nesnenin Notify girişi yoktur: fonksiyon kütüphane tablosunda yaşıyorsa nokta formunu kullanın veya nesnenin gerçekten düşündüğünüz şey olup olmadığını kontrol edin. Örneğin ox_lib ile, lib.notify({...}) lib tablosunda bir nokta çağrısıdır.
5. Fonksiyon daha sonra veya başka dosyada tanımlanır
Yerel bir fonksiyon, aynı dosyadaki çağrısından önce tanımlanmalıdır. Başka bir dosyada tanımlanmış bir fonksiyon yalnızca global ise ve sadece bu dosya aynı tarafta (client veya server) aynı resource tarafından yüklümüyse görünür.
-- fails: DoThing is defined below the call
DoThing()
local function DoThing()
print('hi')
endTanımı çağrının üzerine taşıyın veya local DoThing ile ilk önce bildirin ve daha sonra atayın. fxmanifest.lua kontrol edin: client_scripts, server_scripts veya shared_scripts listelenmemiş bir dosya asla yüklenmez, bu yüzden işlevleri asla yoktur.
client_scripts { 'client/*.lua' }
server_scripts { 'server/*.lua' }
shared_scripts { '@ox_lib/init.lua', 'config.lua' }6. Client fonksiyonu server'da veya tam tersinde kullanıldı
Birçok native ve çerçeve işlevi yalnızca bir tarafta var olur. PlayerPedId yalnızca client, GetPlayerIdentifiers yalnızca server. Çerçeve tabloları da farklıdır: ESX.GetPlayerFromId server fonksiyonu, istemci ESX.GetPlayerData kullanır. shared_scripts içinde çalışan bir script her iki tarafta çalışır, bu yüzden bir tarafta çalışan bir çağrı diğer tarafta çöker.
İpucu: en hızlı test başarısız satırdan hemen önce bir print:
print(type(ESX.GetPlayerFromId)).nilyazdırır sa, fonksiyon eksiktir.functionyazdırır sa, gerçek sorun başka yerde.
Hata ayıklamada bunu koruyun
Çağırmadan önce kontrol edin, böylece kilitlenme yerine açık bir ileti alırsınız:
local fn = ESX.GetPlayerFromId
if type(fn) ~= 'function' then
print('GetPlayerFromId is missing: check the ESX version')
return
endBunları düzeltme olarak yerinde bırakmayın. Gerçek sorunu gizlerler, bu script ve eşleştirilmeyen bir çerçevedir.
Kontrol listesi
| Belirti | Fix |
|---|---|
(global 'X') |
Fonksiyon dosyada tanımlanmadı veya asla yüklenmedi: manifesto ve tanım sırasını kontrol edin |
(field 'X') |
Tablo böyle girişe sahip değildir: yazım ve çerçeve sürümünü kontrol edin |
(method 'X') |
Yanlış nesne veya iki nokta yerine nokta kullanılmış: değişkenin ne tuttuğunu kontrol edin |
| Yalnızca bir tarafta çalışır | Fonksiyon yalnızca client veya yalnızca server'da var |
| Çerçeve güncellemesinden sonra hata | Kaldırılmış işlevi yenisi ile değiştirin veya script'i güncelleyin |
| Export çağrısı nil döndürür | Sağlayan resource'u önce başlatın ve export adını kontrol edin |
Kısa yanıtlar
'attempt to call a nil value' ne anlama geliyor?
Script, bir işlevi fonksiyon olarak çalıştırmaya çalıştı, ancak ad nil tutar, bu yüzden çalıştırılacak bir şey yoktur. Parantez içindeki ad hangi fonksiyonun eksik olduğunu söyler.
Bu hatada field, global ve method arasındaki fark nedir?
Global, Foo() gibi çıplak bir ad, field Config.Foo() veya ESX.Foo() gibi tablo girişi ve method obj:Foo() gibi iki nokta ile çağrıdır. Yalnızca eksik fonksiyona nasıl ulaşıldığını söyler.
Yanlış çerçeve sürümü buna neden olabilir mi?
Evet. Eski veya daha yeni ESX, QBCore veya QBox için yazılmış bir script, sürümünüzün yeniden adlandırdığı veya kaldırdığı bir işlevi çağırabilir, bu da nil tutar.
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 →
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 →