Android平台上,报ASSERT FAILED ON LUA EXECUTE: key not found : <integer/real>的问题

嗨,我用的版本是cocos2d-x-3.1,有个遗留很久的问题一直没解决:

在加载CCArmature时,调用ArmatureDataManager的addArmatureFileInfo接口,经常会报出 LUA ERROR: ASSERT FAILED ON LUA EXECUTE: key not found : <integer/real> 的错误,并且是偶发的。
经测试,该问题只在Android平台上出现,在win和ios上暂未发现。

一度怀疑是文件编码问题,查看之后发现确定是utf8编码,但就是加载报错。

搜索了一下,之前也有人报过相关问题,都没有明确答复。
http://www.cocoachina.com/bbs/read.php?tid=199124&page=1

http://discuss.cocos2d-x.org/t/assert-failed-key-not-found-integer-real/14436

http://www.cocoachina.com/bbs/read.php?tid-235410.html

http://www.cocoachina.com/bbs/read.php?tid=238950

请问到底该如何解决?官方能不能给个明确答复?

好像是fileutil的germapValueformfile中,解析xml文件出错了

在3.3上,应该是解决了的,可以试下

哎,看来又要沉了!!!

顶起来,我也遇到了,但是报错后还是能运行,真是醉了~~~

我也遇到过。。报错但是能运行。后来没用ccs了。

这是我去年的提的问题。。
http://www.cocoachina.com/bbs/read.php?tid-235410.html

上午查了一个上午,发现是文件编码的问题,那些plist文件都变成有BOM的utf8了(坑爹的svn,这一点好像很难排查),最后写了个python脚本把所有的文件夹遍历一遍,去掉所有的bom头~~

嗨,兄弟们,经过我近2周的反复测试,打了无数的log,终于找到问题了。
其实很简单,MB的,就是一个变量没初始化的问题。
CCFileUtils.cpp里面的DictMaker类,有一个变量 _state,这个变量没有初始化,在构造函数里将其初始化成SAX_NONE就可以了。

问题出现的原因:
DictMaker有以下3个函数,用来处理tinyxml2的visit回调
void startElement(void *ctx, const char *name, const char **atts)
void endElement(void *ctx, const char *name)
void textHandler(void *ctx, const char *ch, int len)
当解析带有
utf8 bom头的文件时,会首先调用textHandler这个函数,参数ch就是utf8的bom头:EF,BB,BF,参数len是3,
由于_state没有初始化,所以可能是任一个乱值。而如果恰好
_state==SAX_STRING,就会报
CCASSERT(!_curKey.empty(), “key not found : <integer/real>”)这个错误。

在以往的win平台开发经验中,debug模式下,未初始化的变量为置0,release下未初始化的变量是乱值。但是在我测试的时候,android评上上,debug模式下,未初始化的变量是一个很大的乱值,但release模式下,出现过比较规则的4,5,9,11等等。。。
所以只要在解析带有
utf8 bom头的文件时,并且恰好又
_state==5,也就是
_state==SAX_STRING时,就会报这个错误,并且是偶然发的。

如楼上所说,如果解析的文件是没有bom头的话,就不会先执行textHandler,所以就没问题。

哎,真是坑爹啊!

好帖~貌似我的游戏现在遇到了类似的问题,mark~

我晕,碰到了。。。在最新的v3中还没有修复噢。。。

点赞,楼主的付出和分享,给大家节约了时间