Java (Minecraft Forge): Irgendwie werden NullPointerExceptions sofort angezeigt, nachdem überprüft wurde, ob die betreffJava

Java-Forum
Anonymous
 Java (Minecraft Forge): Irgendwie werden NullPointerExceptions sofort angezeigt, nachdem überprüft wurde, ob die betreff

Post by Anonymous »

Ich versuche, einen Minecraft-Mod namens SimpleRadio zu debuggen, der abstürzt, nachdem er eine Weile auf einem Server ausgeführt wurde, auf dem viele Leute gleichzeitig aktiv waren. Die folgenden Codeausschnitte stammen von RadioManager.java, RadioManager.java bzw. Wire.java in der neuesten Version (Version 3.4.6 für Minecraft Version 1.20.1) des Mods: https://github.com/CodinGlitch/SimpleRadio/tree/1.20.1
In allen Fällen kam es zu Abstürzen im Stil von NullPointer-Ausnahmen, die sich darüber beschwerten, dass eine Variable vorhanden war habe gerade überprüft, dass es nicht gleich null ist ist jetzt irgendwie null.
Ich bin mir ziemlich sicher, dass mit dem Mod irgendein Multithreading-Unsinn vor sich geht; Einer der Abstürze löste eine ConcurrentModificationException für entweder „sourceQueue“ oder „pendingSources“ aus (die Zeilenanzahlen stimmen nicht, daher bin ich nicht sicher, welche genau, allein aufgrund des Stack-Trace).
Was ich damit sagen will ist, dass ich mir ziemlich sicher bin, dass Multithreading ohne synchronisierte Listen die Hauptursache für die Fehler ist, die ich hier sehe, aber die Art des Fehlers, den ich daraus sehe, ist so Verrückt, dass ich mehr als sicher sein möchte, bevor ich irgendein Problem auf einem Server versuche, der versucht, 15+ Leute zu beherbergen, die das Spiel wirklich nur ohne Funkabstürze spielen wollen.
(Beachten Sie, dass ich Multithreading nicht im Sinne einer Art Multithreading des Minecraft-Server-Tickings meine, sondern dass der Netzwerk-Thread, der Pakete akzeptiert (?), und der Hauptserver-Thread miteinander in Konflikt geraten.)
Mein Punkt bei all dem ist nur: was?! Wie kann dieser Fehler auftreten, wenn bereits so offensichtlich sichergestellt ist, dass die Bedingung dafür gar nicht erst eintreten kann? Das erscheint mir so unmöglich, selbst WENN Multithreading-Unsinn auftritt. Hilfe!
(Unten folgt der Code mit ALLEN Fehler-Stack-Traces. Ich werde hier nichts weglassen!)
(Beispiel 1, in RadioManager.java)

Code: Select all

    @Override
public BlockPos travelExtension(BlockPos pos, LevelAccessor level) {
for (Direction direction : Direction.values()) {
BlockPos offsetPos = pos.relative(direction);
BlockEntity blockEntity = level.getBlockEntity(offsetPos);

if (blockEntity instanceof InsulatorBlockEntity insulatorBlockEntity) {
List wires = insulatorBlockEntity.getWires();
if (wires.isEmpty()) continue;

Wiring wire = wires.get(0);
Router router = wire.transport(insulatorBlockEntity.getRouter());

if (router == null) continue;

BlockPos routerPos = router.getLocation().blockPos();

BlockState blockState = level.getBlockState(routerPos);
if (!(blockState.getBlock() instanceof InsulatorBlock)) continue;

Direction routerDirection = blockState.getValue(InsulatorBlock.FACING);
return routerPos.relative(routerDirection.getOpposite());
}
}

return pos;
}

Code: Select all

java.lang.NullPointerException: Cannot read field "location" because "router"  is null
at com.codinglitch.simpleradio.core.registry.blocks.InsulatorBlock.travelExtension(InsulatorBlock.java:74) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.api.central.Frequencing.getAntennaBase(Frequencing.java:63) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.api.central.Frequencing.calculateAntennaPower(Frequencing.java:46) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.core.registry.blocks.TransmitterBlockEntity.tick(TransmitterBlockEntity.java:102) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at net.minecraft.world.level.chunk.LevelChunk$BoundTickingBlockEntity.mixinextras$bridge$m_155252_$7(LevelChunk.java) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixin.tt20.json:world.LevelChunkMixin,pl:mixin:A}
at net.minecraft.world.level.chunk.LevelChunk$BoundTickingBlockEntity.wrapOperation$zhe000$onTick(LevelChunk.java:796) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixin.tt20.json:world.LevelChunkMixin,pl:mixin:A}
at net.minecraft.world.level.chunk.LevelChunk$BoundTickingBlockEntity.m_142224_(LevelChunk.java:689) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:mixin.tt20.json:world.LevelChunkMixin,pl:mixin:A}
at net.minecraft.world.level.chunk.LevelChunk$RebindableTickingBlockEntityWrapper.m_142224_(LevelChunk.java:782) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:classloading}
at net.minecraft.world.level.Level.redirect$zgd000$observable$redirectTick(Level.java:2040) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:botania_xplat.mixins.json:LevelAccessor,pl:mixin:APP:refurbished_furniture.common.mixins.json:LevelMixin,pl:mixin:APP:observable.common.json:LevelMixin,pl:mixin:APP:kubejs-common.mixins.json:LevelMixin,pl:mixin:APP:simpleradio.mixins.json:MixinLevel,pl:mixin:A}
at net.minecraft.world.level.Level.m_46463_(Level.java:468) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:botania_xplat.mixins.json:LevelAccessor,pl:mixin:APP:refurbished_furniture.common.mixins.json:LevelMixin,pl:mixin:APP:observable.common.json:LevelMixin,pl:mixin:APP:kubejs-common.mixins.json:LevelMixin,pl:mixin:APP:simpleradio.mixins.json:MixinLevel,pl:mixin:A}
at net.minecraft.server.level.ServerLevel.m_8793_(ServerLevel.java:351) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:botania_xplat.mixins.json:ServerLevelMixin,pl:mixin:APP:refurbished_furniture.common.mixins.json:ServerLevelMixin,pl:mixin:APP:observable.common.json:ServerLevelMixin,pl:mixin:APP:mixin.tt20.json:world.ServerLevelMixin,pl:mixin:APP:blueprint.mixins.json:ServerLevelMixin,pl:mixin:APP:moonlight-common.mixins.json:ServerLevelMixin,pl:mixin:APP:immersiveengineering.mixins.json:coremods.ServerWorldMixin,pl:mixin:APP:ksyxis.mixins.json:ServerLevelMixin,pl:mixin:APP:supplementaries-common.mixins.json:ServerLevelMixin,pl:mixin:APP:kubejs-common.mixins.json:ServerLevelMixin,pl:mixin:APP:simpleradio.mixins.json:MixinServerLevel,pl:mixin:APP:create.mixins.json:accessor.ServerLevelAccessor,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_5703_(MinecraftServer.java:893) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at net.minecraft.server.dedicated.DedicatedServer.m_5703_(DedicatedServer.java:283) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:APP:blueprint.mixins.json:DedicatedServerMixin,pl:mixin:APP:mixins/common/nochatreports.mixins.json:server.MixinDedicatedServer,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:814) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:661) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251)  ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at java.lang.Thread.run(Thread.java:833) ~[?:?] {re:mixin}
(Beispiel 2, in RadioManager.java)

Code: Select all

        List acceptedSources = new ArrayList();
Iterator iterator = sourceQueue.iterator();
while (iterator.hasNext()) {
QueuedSource source = iterator.next();
if (source == null) {
iterator.remove();
continue;
}

source.time--;
if (source.time  {
if (queued.source.getWireMedium().equals(this) && queued.router.equals(origin)) {
int maxProgress = Math.round(SimpleRadioLibrary.SERVER_CONFIG.wire.transmissionTime * this.getLength());
float progress = (float) queued.time / maxProgress;

timeUntilDemise.set((int) Math.ceil((float)queued.time / 2f));
if (isReversed) {
placeOfDemise.set(1 - progress);
} else {
placeOfDemise.set(progress);
}
return true;
}
return false;
})) {
this.queueDemise(timeUntilDemise.get(), placeOfDemise.get());
}
}
(Entsprechende Prüfung für Beispiel 3, in RadioManager.java)

Code: Select all

public boolean readQueue(Predicate filter) {
for (QueuedSource source : sourceQueue) {
if (source == null) continue;
if (filter.test(source)) return true;
}
for (QueuedSource source : pendingSources) {
if (source == null) continue;
if (filter.test(source)) return true;
}

return false;
}

Code: Select all

java.lang.NullPointerException: Cannot read field "source" because "queued"  is null
at com.codinglitch.simpleradio.core.registry.entities.Wire.lambda$relay$0(Wire.java:158) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.radio.RadioManager.readQueue(RadioManager.java:425) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:mixin,re:classloading}
at com.codinglitch.simpleradio.core.registry.entities.Wire.relay(Wire.java:157) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.api.central.Socket.distribute(Socket.java:47) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.radio.RadioRouter.route(RadioRouter.java:231) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.radio.RadioRouter.route(RadioRouter.java:258) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.radio.RadioRouter.accept(RadioRouter.java:203) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:classloading}
at com.codinglitch.simpleradio.radio.RadioManager.serverTick(RadioManager.java:400) ~[simpleradio-forge-1.20.1-3.4.6.jar%23401!/:3.4.6] {re:mixin,re:classloading}
at net.minecraft.server.MinecraftServer.handler$bkb000$simpleradio$tickServer_radioTicking(MinecraftServer.java:5340) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_5705_(MinecraftServer.java:836) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_130011_(MinecraftServer.java:661) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at net.minecraft.server.MinecraftServer.m_206580_(MinecraftServer.java:251) ~[server-1.20.1-20230612.114412-srg.jar%23431!/:?] {re:mixin,pl:accesstransformer:B,re:mixin,pl:accesstransformer:B,re:classloading,pl:accesstransformer:B,pl:mixin:A}
at java.lang.Thread.run(Thread.java:833) ~[?:?] {re:mixin}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post