You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

问题根源

  1. 未检查character实例有效性:回到主页时character可能已被销毁,直接调用其方法会触发Null引用错误。
  2. 状态变量无Null校验:直接判断==true/false,若变量未定义或为null会导致逻辑异常。
  3. 事件移除时机错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:39:53