Java (Minecraft Forge): каким-то образом возникают исключения NullPointerException сразу после проверки того, что рассмаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java (Minecraft Forge): каким-то образом возникают исключения NullPointerException сразу после проверки того, что рассма

Сообщение Anonymous »

Я пытаюсь отладить мод Minecraft под названием SimpleRadio, который дает сбой после некоторого времени работы на сервере, на котором одновременно работает много людей. Следующие фрагменты кода взяты из RadioManager.java, RadioManager.java и Wire.java соответственно в последней версии (версия 3.4.6 для Minecraft версии 1.20.1) мода: https://github.com/CodinGlitch/SimpleRadio/tree/1.20.1
Во всех случаях мы сталкивались с сбоями в духе исключений NullPointer, жалующихся, что переменная, которая только что была проверена на ненулевое значение непосредственно перед этим, теперь почему-то имеет нулевое значение.
Я совершенно уверен, что с модом происходит какая-то многопоточная ерунда; один из сбоев вызвал исключение ConcurrentModificationException либо для sourceQueue, либо для pendingSources (счет строк отключен, поэтому я не уверен, какая именно из них, исходя только из трассировки стека).
Я пытаюсь сказать, что Я совершенно уверен, что многопоточность без синхронизированных списков является основной причиной ошибок, которые я здесь вижу, но природа ошибки, которую я вижу, такова сумасшедшие, я хочу быть более чем уверен, прежде чем пробовать какое-либо исправление на сервере, на котором пытаются разместить более 15 человек, которые на самом деле просто хотят играть в игру без сбоев, связанных с радио.
(Обратите внимание, что я не имею в виду многопоточность с точки зрения некоторой многопоточности сервера Minecraft, а то, что сетевой поток, который принимает пакеты (?), и основной поток сервера мешают друг другу.)
Я хочу сказать следующее: что?! Как может возникнуть эта ошибка, если она уже настолько явно удостоверилась, что условия для ее возникновения вообще не могут произойти? Мне это кажется невозможным, даже ЕСЛИ происходит ерунда с многопоточностью. Помогите!
(Ниже приведен код со ВСЕМИ трассировками стека ошибок. Здесь ничего не оставлю!)
(Пример 1, в RadioManager.java)
@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;
}

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}

(Пример 2, в RadioManager.java)
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());
}
}

(Соответствующая проверка, например 3, в RadioManager.java)
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;
}

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}


Подробнее здесь: https://stackoverflow.com/questions/798 ... tely-after
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»