= 创作分享 =
编程开发
关于TileEntity的保存问题(1.7.10)
xujunhao6082

关于TileEntity的保存问题(1.7.10)

xujunhao6082 于 2023-8-15 11:49 ( 9月前 ) [复制链接] [只看楼主] [打印]
318 1
众所周知,TileEntity靠readFromNBT和writeToNBT读取与保存,但是我却出现了保存读取后直接变成原样的bug,在分析这个bug时,我开始以为是没保存上,但利用NBTExploer发现实际上是成功保存了的,这个时候我开始着手分析readFromNBT,但始终没有发现任何方法本身的问题,最大的问题是方法没有被调用,于是我向上找调用者,找到了读取存档时创建TileEntity的函数,然后加了个条件断点跑,这才发现了根本性的问题:java.lang.NoSuchMethodException。Minecraft在读取存档时,会使用NBT中的id(就是TileEntity注册时的id)在一个HashMap里找对应的类对象(这里用了反射),找到后用class.newInstance()(反射的创建对象)创建TileEntity,Minecraft会拦截在这个过程中的异常,产生了之前的问题,自然后面的读取就不了了之了。newInstance()只能接受构造方法无参数并且不是抽象类的类(接口也不行),而java.lang.NoSuchMethodException正是因为找不到无参数构造方法导致的,于是我给我的TileEntity类加上了一个无参数构造方法。
这提醒我们写TileEntity的时候一定要记得留一个无参数构造方法,并且如果是内部类的话一定要是静态的(这牵扯到我写MessageHandle的经历,同样采用了newInstance(),非静态内部类在构造时会自带一个隐藏参数(上一级对象))。解决这个问题花了我一下午的时间。


点评

非常好的说明,这使我理解的我的服务端bug  发表于 2023-12-16 00:57
发表于 2023-8-15 11:49:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

回复 | 举报

该帖共收到 2 条回复!
huase
Entity的时候一定要记得留一个无参数构造方法
发表于 2023-12-7 12:34:54 | 只看该作者

回复 | 举报

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

本版积分规则

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

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

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