AS3角色皮肤符号出现TypeError #1009空对象引用错误求助
角色皮肤功能TypeError #1009修复方案
错误场景
点击单人/双人游玩模式的主页按钮时,角色皮肤功能触发两处Null引用错误,报错信息如下:
TypeError: Error #1009: Cannot access a property or method of a null object reference. at BlowfishPong_fla::MainTimeline/playerSkin()[BlowfishPong_fla.MainTimeline::frame22:352] at BlowfishPong_fla::MainTimeline/frame47()[BlowfishPong_fla.MainTimeline::frame47:176] at flash.display::MovieClip/gotoAndStop() at BlowfishPong_fla::MainTimeline/doubleGame()[
原角色皮肤脚本
character.addEventListener(Event.ENTER_FRAME, playerSkin); function playerSkin(e: Event): void { if (Kirara_selected == true && Kirara_skinSelected == true) { if (Kirara_OnePieceSS_Selected == true) { character.gotoAndStop(11); } else if (Kirara_BeachS_Selected == true) { character.gotoAndStop(10); } else if (Kirara_Wetsuit_Selected == true) { character.gotoAndStop(9); } } else if (Towa_selected == true && Towa_skinSelected == true) { if (Towa_OnePieceSS_Selected == true) { character.gotoAndStop(12); } else if (Towa_Wetsuit_Selected == true) { character.gotoAndStop(13); } } else if (Yui_selected == true && Yui_skinSelected == true) { if (Yui_BeachS_Selected == true) { character.gotoAndStop(14); } else if (Yui_SwimClubSS_Selected == true) { character.gotoAndStop(15); } else if (Yui_OnePieceSS_Selected == true) { character.gotoAndStop(16); } } else if (Peach_selected == true && Peach_skinSelected == true) { if (Peach_LeotardSS_Selected == true) { character.gotoAndStop(18); } else if (Peach_Wetsuit_Selected == true) { character.gotoAndStop(17); } else if (Peach_OnePieceSS_Selected == true) { character.gotoAndStop(19); } } else { if(Minami_selected == false && Minami_skinSelected == false){ character.gotoAndStop(1); } else if(SwimsuitCiel_selected == true){ character.gotoAndStop(33); } else if(IrisAnother_selected == true){ character.gotoAndStop(26); } else if(SaintGermain_selected == true){ character.gotoAndStop(34); } character.removeEventListener(Event.ENTER_FRAME, playerSkin); } }
问题根源
- 未检查
character实例有效性:回到主页时character可能已被销毁,直接调用其方法会触发Null引用错误。 - 状态变量无Null校验:直接判断
==true/false,若变量未定义或为null会导致逻辑异常。 - 事件移除时机错误:else块中无论
character是否存在都会执行移除操作,无效实例触发错误。
修复后的代码
// 先确认character存在再绑定事件 if (character) { character.addEventListener(Event.ENTER_FRAME, playerSkin); } function playerSkin(e: Event): void { // 先校验character实例,无效则移除事件并退出 if (!character) { e.target.removeEventListener(Event.ENTER_FRAME, playerSkin); return; } // 用Boolean()处理状态变量的Null/undefined情况 if (Boolean(Kirara_selected) && Boolean(Kirara_skinSelected)) { if (Boolean(Kirara_OnePieceSS_Selected)) { character.gotoAndStop(11); } else if (Boolean(Kirara_BeachS_Selected)) { character.gotoAndStop(10); } else if (Boolean(Kirara_Wetsuit_Selected)) { character.gotoAndStop(9); } } else if (Boolean(Towa_selected) && Boolean(Towa_skinSelected)) { if (Boolean(Towa_OnePieceSS_Selected)) { character.gotoAndStop(12); } else if (Boolean(Towa_Wetsuit_Selected)) { character.gotoAndStop(13); } } else if (Boolean(Yui_selected) && Boolean(Yui_skinSelected)) { if (Boolean(Yui_BeachS_Selected)) { character.gotoAndStop(14); } else if (Boolean(Yui_SwimClubSS_Selected)) { character.gotoAndStop(15); } else if (Boolean(Yui_OnePieceSS_Selected)) { character.gotoAndStop(16); } } else if (Boolean(Peach_selected) && Boolean(Peach_skinSelected)) { if (Boolean(Peach_LeotardSS_Selected)) { character.gotoAndStop(18); } else if (Boolean(Peach_Wetsuit_Selected)) { character.gotoAndStop(17); } else if (Boolean(Peach_OnePieceSS_Selected)) { character.gotoAndStop(19); } } else { if(!Boolean(Minami_selected) && !Boolean(Minami_skinSelected)){ character.gotoAndStop(1); } else if(Boolean(SwimsuitCiel_selected)){ character.gotoAndStop(33); } else if(Boolean(IrisAnother_selected)){ character.gotoAndStop(26); } else if(Boolean(SaintGermain_selected)){ character.gotoAndStop(34); } // 确认实例有效再移除事件 character.removeEventListener(Event.ENTER_FRAME, playerSkin); } }
关键修复点说明
- 所有对
character的操作前都添加存在性校验,避免Null引用。 - 使用
Boolean()转换状态变量,自动处理null/undefined场景,替代直接的==true/false判断。 - 事件监听绑定前先检查实例有效性,避免给Null对象绑定事件。
- 事件处理函数开头增加实例校验,无效时立即清理事件并退出,防止后续错误。
内容的提问来源于stack exchange,提问作者Isaac Yeap Jie Ling
相关产品推荐
相关产品推荐

