Versuch, mit einem nil-Wert zu rechnen
Ein Script wollte mit einem leeren Wert rechnen — sehr oft ein Geld- oder Item-Betrag, der nie gesetzt wurde.
Mach das zuerst
Prüf die Zeile des Spielers in der Datenbank auf leere Werte in der Spalte, die die Meldung nennt.
Was es bedeutet
+, -, *, /, % oder ^ wurde auf etwas angewendet, das keine Zahl ist. Die Meldung nennt es: attempt to perform arithmetic on a nil value (field 'amount').
Lua wandelt numerische Zeichenketten in der Arithmetik um ("5" + 1 ist 6), also löst eine Zeichenkette das selten aus. Ein nil fast immer.
Was es auslöst
Sortiert danach, wie oft es die Antwort ist.
- 1
Ein fehlendes Tabellenfeld
Config.Prices[item] * count, wenn dieses Item keinen Preiseintrag hat. - 2
Eine Datenbankspalte, die NULL ist
NULL kommt als nil zurück, nicht als 0. Eine Spielerzeile, deren
banknie initialisiert wurde, zerlegt jede Saldoberechnung, die sie anfasst. - 3
Ein Wert, den der Client hätte schicken sollen und nicht schickte
Ein Event-Handler, der
amount * priceauf einer Nutzlast rechnet, in der der Client es weggelassen hat. - 4
In eine nicht initialisierte Variable aufsummieren
total = total + x, wobeitotaldeklariert, aber nie mit einem Startwert versehen wurde.
Wie du erkennst, welcher deiner ist
Gib den in der Meldung genannten Operanden aus. Kam er aus der Datenbank, prüf die Spalte auf NULL:
SELECT COUNT(*) FROM users WHERE bank IS NULL;
Wo du nachsehen musst
Die genannte Zeile, dann die Quelle dieses Operanden.
Wie du es behebst
Setz den Standardwert beim Lesen, nicht beim Benutzen:
local price = Config.Prices[item] or 0 local total = price * (count or 1)
Und in der Datenbank: mach das Problem unwiederholbar:
ALTER TABLE users MODIFY bank INT NOT NULL DEFAULT 0;
Hängst du immer noch an deinem eigenen Code?
Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.
bug_reportServer Fixer öffnenFür diese Art Fehler Script Optimizer liest das Script und repariert den Code dahinter.
Fehler, die mit diesem zusammen auftreten
- Versuch, zwei unvereinbare Werte zu vergleichen
- Unbekannte Spalte in der Feldliste
- Tote Coroutine kann nicht fortgesetzt werden
- SCRIPT ERROR in citizen:/scripting/lua/scheduler.lua
- Versuch, eine Zahl, einen Boolean oder Text zu indizieren
- Versuch, über eine C-Aufrufgrenze zu yielden
- Stack-Überlauf
- Tabellenindex ist nil