Home
» 🎮 E-sport
»
Oplossing voor Minecraft Config-crash: Verhelpt de foutmelding "Kan geen configuratiewaarde ophalen voordat deze is geladen".
Oplossing voor Minecraft Config-crash: Verhelpt de foutmelding "Kan geen configuratiewaarde ophalen voordat deze is geladen".
Om de Minecraft-configuratiecrash op te lossen, moet je stoppen met het lezen van een Forge-configuratiewaarde totdat Forge de bijbehorende configuratie heeft geladen. Registreer de configuratie ForgeConfigSpecin de constructor van je mod en lees vervolgens de waarden ervan uit de `<config>`- ModConfigEvent.Loadingof ModConfigEvent.Reloading`<callback>`-functie van die configuratie. Als je een mod van iemand anders installeert, moet je de mod die in het crashrapport wordt genoemd bijwerken of isoleren; de code voor de oplossing is van de auteur van die mod.
Het bericht wordt doorgaans als volgt geformuleerd IllegalStateException: Cannot get config value before config is loaded: . Het wijst op een vroege leesbewerking van een configuratiewaarde, maar de exacte stacktrace en loader zijn van belang. Het onderstaande Forge-voorbeeld is geschreven voor de Forge 1.20.1 API-stijl; plak het niet ongewijzigd in NeoForge of een Fabric-project.
Wat de Minecraft-configuratiefout IllegalStateException betekent
Forge laat een mod een instelling declareren ForgeConfigSpecen zorgt voor het laden van de waarden uit configuratiebestanden. Een ConfigValueinstelling is een verwijzing naar een instelling; een aanroep .get()vraagt om de geladen waarde. Als die leesbewerking plaatsvindt voordat Forge de juiste configuratie heeft gekoppeld en geladen, gooit Forge een IllegalStateException in plaats van een waarde terug te geven.
Een statisch veld dat ConfigValuezichzelf opslaat, is niet per se een probleem. Het risico zit hem in het evalueren ervan MY_SETTING.get()tijdens de initialisatie van een klasse, in een constructor die te vroeg wordt uitgevoerd, of in code die wordt geactiveerd voordat de configuratie is geladen. Een gecachede waarde kan ook verouderd raken na het herladen van een bestand, tenzij de module de herlaadgebeurtenis afhandelt.
Los de Forge-configuratiecrash op in vier stappen.
Stap 1: Zoek uit welke module de waarde te vroeg uitleest.
Open het meest recente latest.logcrashrapport en zoek de eerste foutmelding IllegalStateException. Lees de stacktrace van boven naar beneden totdat deze de configuratieklassen van Forge verlaat en een modpakket binnengaat. Dat eerste frame dat eigendom is van de mod, geeft meestal de locatie van de aanroep aan. Noteer de Minecraft-, Forge- en modversies, en of de crash optreedt op een client, een dedicated server, bij het laden van een wereld of bij het herladen.
Als je een speler bent, maak dan eerst een kopie van het profiel. Update de betreffende mod en de bijbehorende afhankelijkheden naar versies die geschikt zijn voor dezelfde Minecraft- en Forge-versies. Als de crash aanhoudt, schakel dan alleen de verdachte mod uit in het gekopieerde profiel om de oorzaak te bevestigen. Stuur vervolgens de volledige log en de exacte versies naar de auteur van de mod. Verwijder niet alle configuratiebestanden: dit kan instellingen wissen zonder een eerdere codefout te corrigeren.
De eerste aanroep van een functie die eigendom is van de applicatie, na de config-getter, is de regel die we moeten inspecteren.
Stap 2: Definieer en registreer de configuratiespecificatie
Bouw de specificatie eenmaal op, bewaar het waardeobject en registreer diezelfde specificatie vanuit de mod-constructor. Dit voorbeeld definieert een begrensd geheel getal in een algemene configuratie:
public final class MyModConfig {
public static final ForgeConfigSpec SPEC;
public static final ForgeConfigSpec.IntValue MAX_MOBS;
static {
ForgeConfigSpec.Builder builder = new ForgeConfigSpec.Builder();
MAX_MOBS = builder.defineInRange("maxMobs", 10, 0, 100);
SPEC = builder.build();
}
}
Zorg ervoor dat het opgegeven configuratietype overeenkomt met de locatie waar de instelling thuishoort. Forge onderscheidt CLIENT, COMMON, en SERVERconfiguraties; de serverconfiguratie van een wereld is niet uitwisselbaar met een clientconfiguratiebestand.
Registreer de Forge-configuratiespecificatie van de mod-constructor voordat Forge het bijbehorende bestand laadt.
Stap 3: Lees de waarden uit de overeenkomende laad- en herlaadgebeurtenissen.
Registreer luisteraars op de gebeurtenisbus van de mod en controleer de specificatie van de gebeurtenis voordat je deze leest. Forge verzendt configuratiegebeurtenissen voor de configuraties van de mod, dus een luisteraar moet gebeurtenissen met andere specificaties negeren. Vernieuw een runtime-snapshot bij de eerste keer laden en opnieuw bij het herladen:
Gebruik de in de cache opgeslagen runtime-waarde waar de functie deze nodig heeft, in plaats van configuratie-leesbewerkingen te verspreiden via statische initialisaties. Als een functie kan worden uitgevoerd voordat de configuratie is geladen, stel die functie dan uit of zorg voor een weloverwogen veilige standaardwaarde. Roep de interne configuratietracker van Forge niet aan en forceer geen handmatige laadbewerking om de volgordefout te verbergen.
Filter elk evenement aan de hand van je specificaties, zodat de ene callback geen andere configuratie leest.
Stap 4: Test hetzelfde opstartpad dat is vastgelopen.
Start de ontwikkelclient van het project en herhaal vervolgens de actie die oorspronkelijk mislukte: laad een wereld, start de dedicated server of herlaad de configuratie. Controleer of het crashrapport de 'early config-value exception' niet meer bevat en of de runtime snapshot verandert na een geldige herlaadactie. Als de instelling serverspecifiek is, test dan zowel de client als een serverwereld. Gebruik de Gradle-uitvoeringstaken die door de Forge MDK van uw project worden geleverd; taaknamen kunnen per configuratie verschillen.
Forge-levenscyclusgebeurtenissen zoals de algemene setup zijn geen vervanging voor de callback voor het laden van de configuratie. De gebeurtenisbus van de module voert veel levenscyclusgebeurtenissen parallel uit, dus het verplaatsen van een leesbewerking naar een willekeurige setup-handler garandeert op zichzelf geen veilige volgorde. Gebruik de gedocumenteerde configuratiegebeurtenis voor de waarde en gebruik de juiste thread-overdracht alleen wanneer de bewerking zelf op een specifieke thread moet worden uitgevoerd.
Bevestig dat het opstarten en herladen zonder problemen is verlopen.
Als het project gebruikmaakt van Fabric of NeoForge
Fabric Loader biedt geen Forge-callback ForgeConfigSpecof een universele ConfigLoadingEventscallback. Fabric-mods gebruiken vaak een aparte configuratiebibliotheek of een eigen bestandslezer. Identificeer die afhankelijkheid aan de hand van de stacktrace en volg de laad- en herlaad-API van de betreffende versie; zorg ervoor dat de bibliotheek is geïnitialiseerd voordat de mod de waarden ervan leest. Fabric-entrypoints worden vroeg tijdens het opstarten uitgevoerd, dus ga er niet vanuit dat een initialisatiefunctie betekent dat alle configuratiebestanden van derden al zijn geladen.
Als de stacktrace een naam bevat net.neoforged, raadpleeg dan de NeoForge API-documentatie voor de exacte Minecraft- en NeoForge-versie. Forge en NeoForge delen concepten, maar hun pakketnamen en ondersteunde API's kunnen verschillen. Gebruik geen codefragmenten van beide platforms door elkaar en voeg geen fictieve callback toe om de uitzondering te onderdrukken.
Snelle checklist voor preventie
Registreer elke Forge-configuratiespecificatie vanuit de mod-constructor.
Houd configuratiedeclaraties gescheiden van aanroepen die deze evalueren .get().
Lees de waarden na de bijbehorende configuratielaadgebeurtenis en vernieuw de in de cache opgeslagen waarden bij het herladen.
Vergelijk het configuratietype en test de kant waar het daadwerkelijk wordt geladen.
Als er in de stacktrace een andere mod wordt genoemd, stuur dan het volledige logbestand en de compatibele versie naar de auteur van die mod.