MC百科社群

标题: [1.18.2 Forge Mod DEV] 方块实体绑定方块,使用.get()获取报错Null [打印本页]

作者: JEMods    时间: 2023-8-10 14:13
标题: [1.18.2 Forge Mod DEV] 方块实体绑定方块,使用.get()获取报错Null
废话不多说,如题目:相关代码
  1. [spoiler=BlockInit相关]<div class="blockcode"><blockquote>public static BlockBehaviour.Properties makeConfig(float strength
  2.             , Material material, Boolean needTool, SoundType sound)
  3.     {
  4.         BlockBehaviour.Properties properties = BlockBehaviour.Properties.of(material);
  5.         properties = properties.sound(sound);
  6.         if (needTool) properties = properties.requiresCorrectToolForDrops();
  7.         properties = properties.strength(strength, strength);
  8.         return properties;
  9.     }

  10.     public static <T extends BlockEntity> RegistryObject<BlockEntityType<? extends T>> regBlockEntity(
  11.             BlockEntityType.BlockEntitySupplier<? extends T> p, Block block, String id)
  12.     {
  13.         return BLOCK_ENTITY_TYPES.register(id,
  14.                 () -> BlockEntityType.Builder.of(p, block).build(DSL.remainderType()));
  15.     }
  16.     public static final RegistryObject<Block> MAGNETIZER = BLOCK_REGISTER.register("magnetizer",
  17.             () -> new Magnetizer(
  18.             makeConfig(1.4F, Material.METAL, true, SoundType.STONE)
  19.     ));
  20.     public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITY_TYPES =
  21.             DeferredRegister.create(ForgeRegistries.BLOCK_ENTITIES, Values.MOD_ID);
  22.     public static final RegistryObject<BlockEntityType<? extends BlockEntity>> MAGNETIZER_ENT =
  23.             regBlockEntity(MagnetizerEntity::new, MAGNETIZER.get(), "magnetizer");
复制代码
[/spoiler]
在最后一行 "MAGNETIZER.get()"报错
GET方法源码
  1. @NotNull
  2.     @Override
  3.     public T get()
  4.     {
  5.         T ret = this.value;
  6.         Objects.requireNonNull(ret, () -> "Registry Object not present: " + this.name);
  7.         return ret;
  8.     }
复制代码
应该就在 Objects.requireNonNull(ret, () -> "Registry Object not present: " + this.name);失败
调试时我发现"this.value" 的值是null
最后也报了:
Caused by: java.lang.NullPointerException: Registry Object not present: supertech:magnetizer
可是我这创建方法好像也没问题啊,我看了其他的RegistryObject<Block>的value也都是null啊.....



作者: MBYL_InkAndSoul    时间: 2023-8-11 22:43
额……要不你先重新格式化一下帖子……
或者传完整的代码文件,而不是切成两半?
我不清楚是不是,但我猜是初始化问题:
在Forge中,@Mod注解的类率先初始化,其次再是其他类(反正默认情况下无论如何都比@Mod初始化更晚)。
因为一个类在没有被调用前不会被加载,所以没有被初始化,固然注册项的值是空。
在@Mod注解的类的静态初始化中调用你的注册类试试。
作者: MBYL_InkAndSoul    时间: 2023-8-11 22:44
本帖最后由 MBYL_InkAndSoul 于 2023-8-11 22:47 编辑
MBYL_InkAndSoul 发表于 2023-8-11 22:43
额……要不你先重新格式化一下帖子……
或者传完整的代码文件,而不是切成两半?
我不清楚是不是,但我猜是 ...

(我之前自认为写得没有问题的代码就是这样出问题的……)
作者: QQ酱713647    时间: 2023-8-20 23:43
你好,我也遇到这个问题了
把项目打包后放到游戏里就不会报错,不知道为啥
作者: QQ酱713647    时间: 2023-8-21 00:17
找到原因了,因为@Mod注解是唯一注解,整个项目里只能出现一次




欢迎光临 MC百科社群 (https://bbs.mcmod.cn/) MC百科|最大的MineCraft中文模组百科