= 创作分享 =
你问我答
[1.18.2 Forge Mod DEV] 方块实体绑定方块,使用.get()获 ...
JEMods

[1.18.2 Forge Mod DEV] 方块实体绑定方块,使用.get()获取报错Null

JEMods 于 2023-8-10 14:13 ( 1年前 ) [复制链接] [只看楼主] [打印]
532 4
10RF
废话不多说,如题目:相关代码
  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啊.....


发表于 2023-8-10 14:13:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 4 条回复!
是墨靈不是墨白
额……要不你先重新格式化一下帖子……
或者传完整的代码文件,而不是切成两半?
我不清楚是不是,但我猜是初始化问题:
在Forge中,@Mod注解的类率先初始化,其次再是其他类(反正默认情况下无论如何都比@Mod初始化更晚)。
因为一个类在没有被调用前不会被加载,所以没有被初始化,固然注册项的值是空。
在@Mod注解的类的静态初始化中调用你的注册类试试。
发表于 2023-8-11 22:43:03 | 只看该作者

回复 | 举报

是墨靈不是墨白
本帖最后由 MBYL_InkAndSoul 于 2023-8-11 22:47 编辑
MBYL_InkAndSoul 发表于 2023-8-11 22:43
额……要不你先重新格式化一下帖子……
或者传完整的代码文件,而不是切成两半?
我不清楚是不是,但我猜是 ...

(我之前自认为写得没有问题的代码就是这样出问题的……)
发表于 2023-8-11 22:44:04 | 只看该作者

回复 | 举报

姓任的人
你好,我也遇到这个问题了
把项目打包后放到游戏里就不会报错,不知道为啥
发表于 2023-8-20 23:43:15 | 只看该作者

回复 | 举报

姓任的人
找到原因了,因为@Mod注解是唯一注解,整个项目里只能出现一次
发表于 2023-8-21 00:17:19 | 只看该作者

回复 | 举报

百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表