文档章节

TypeError: Error #1009: 无法访问空对象引用的属性或方法。

童年伊梦
 童年伊梦
发布于 2012/09/25 12:59
字数 1230
阅读 14588
收藏 1

在flash as3.0编程实践中,我们常常发现在编译的时候输出面板上出现如下报错:

TypeError: Error #1009: 无法访问空对象引用的属性或方法。

这里转载一篇来自csdn的一篇博文:

AS3 无法访问空对象引用的属性或方法AS3 无法访问空对象引用的属性或方法AS3  flash cs4自带的编译器实在是太一般,只报错误,不曝错误行,最让人郁闷的是 “无法访问空对象引用的属性或方法” 只指出错误文件而不报错误行。 

这个错误的原因是访问,设置了空对象的属性或者调用了空对象的方法。 

第一点可能: 

比如 var obj:Object; 

obj.aaa() 

当这行错误代码在as文文件中,被fla调用,就会报错。 

第二点可能: 

最为广泛的是stage对象,如果一个已经编译的swf文件被导入到fla作为一个元件,当这个swf有stage对象的代码, 

将把导入的舞台作为它的stage,但是它是无法获取的,因此会造成swf中调用的stage=null,编译器报出“无法访问空对象引用的属性或方法”。 

例如stage.displayState=StageDisplayState.FULL_SCREEN 

将造成编译错误。这个错误同样会发生在as文档类中。如果a是某fla的文档类,a中实例化另一个b类,如果b类中有stage对象,或者其他空对象,就会报错。请仔细检查。 

解决方法:增加    对象名.addEventListener(Event.ADDED_TO_STAGE, 处理函数名),然后在处理函数里写stage相关的操作。注意只可在此函数里或此函数调用的函数里写。还要import flash.events.Event 

第三点可能: 
Load一个大文件时,没有侦听COMPLETE事件,就急忙为这个文件的Loader赋值各种参数,由于没有加载完全,将导致找不到对象。 

解决方法:Loader.addEventListener(Event.COMPLETE,setting)setting为加载完毕执行的函数 

并记得 import flash.events.Event 

第四点:没有addChild到容器内 

一个文件t1.as 
------------------------------------------------- 
package{ 
import flash.display.Sprite 
public class t1 extends Sprite 

function t1() 

var circle = new Sprite(); 
circle.graphics.beginFill(0x000000, 1) 
circle.graphics.drawCircle(0, 0, 15); 
addChild(circle); 
circle.graphics.endFill(); 




------------------------------------------------------- 
另一个文件t0.as 
-------------------------------------------- 
package { 
import flash.display.Sprite; 
public class t0 extends Sprite { 

function t0() { 
var obj=new t1(); 
//addChild(obj)   //漏掉了addChild 
trace(this); 



新建一个fla,设置文档类为t1,发现可以画出一个黑色的园,但如果设置文档类为t0,就报出无法访问空对象。 

因为每一个as文件,我们可以把它看做是一个独立的文档性显示对象容器(displayObjectContainer),.as文件对象中的addChild实际上是把各种显示对象添加到这个容器里。 

只有被fla设为文档类的as文件,才会被添加到stage里。其他的都是一个个装满显示对象的容器。当我们需要在舞台上显示它们时,必须先在文档类as文件代码里实例化,然后addChild();

  在这里,通过看网上的一个教程,我尝试着做一个模拟手机触屏拖动解锁的flash。

  最后效果图如下:

  

                                        01

  

                                        02

  

                                        03

  舞台UI部分:

  舞台时间轴结构如下:

  

  第一层:灰色背景和手机

  第二层:第一帧存放的是

              

             第二帧存放的是一个剪辑动画,logo从上往下、alpha从0到1的一个缓动。

  第三层:Actionscipt

import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.display.MovieClip;

stop();//在第一帧停止
var startX:Number = dragMc.x;//将舞台上的dragMc的x坐标存放一个变量中
var startY:Number = dragMc.y;//将舞台上的dragMc的x坐标存放一个变量中
var myRect:Rectangle = new Rectangle(startX,startY,slideMc.width - dragMc.width,0);   //dragMc的拖动限制矩形
var rt:MovieClip = root as MovieClip;
dragMc.buttonMode = true;
dragMc.addEventListener(MouseEvent.MOUSE_DOWN,ondown);
stage.addEventListener(MouseEvent.MOUSE_UP,onup);//给stage添加鼠标释放侦听,而不是针对dragMc。读者可以尝试给dragMc添加的情形

functionondown(e:MouseEvent):void
{
dragMc.startDrag(true,myRect);
dragMc.addEventListener(Event.ENTER_FRAME,onframe);
}
functiononup(e:MouseEvent):void
{
if (this.currentFrame == this.totalFrames)//看舞台帧是否在第二帧
{
return;
}
else
{
dragMc.removeEventListener(Event.ENTER_FRAME,onframe);
dragMc.stopDrag();
}

/********onup函数刚开始我在里面是这么写的

dragMc.removeEventListener(Event.ENTER_FRAME,onframe);
dragMc.stopDrag();

并没有if---else语句,这么写为什么会报空对象的错误呢?按照这个例子,有可能在第二帧才释放鼠标。如果在第二帧,舞台上并没有对象dragMc,而直接写dragMc.removeEventListener(Event.ENTER_FRAME,onframe);的话就会报上面的错误。**********************/

}
functiononframe(e:Event):void
{
if (dragMc.x >= slideMc.x + slideMc.width / 2 - dragMc.width * 2 / 3)
{
dragMc.removeEventListener(Event.ENTER_FRAME,onframe);
gotoAndStop(2);

/**********刚开始编写代码的时候,我把gotoAndStop(2)写在了语句 dragMc.removeEventListener(Event.ENTER_FRAME,onframe);
的前面,就报了空对象的错误。问题就在这里,如果先执行舞台帧停止在第二帧,再执行dragMc删除侦听的话,就会出现这种错误,原因还是舞台第二帧并没有dragMc对象。********************/
}
}

© 著作权归作者所有

童年伊梦
粉丝 1
博文 29
码字总数 21736
作品 0
浦东
私信 提问
在as文件中调用mxml的中的控件报错

我有一个名为win_detail.mxml的Application文件 在win_detail.mxml文件中有一个 在这个文件中引入了 在RequestData.as中 updateDataByBox()方法中 我有这样的一处代码: var unix_app:unix_...

Zofda
2011/03/25
1K
1
异常处理.异常对象

1.PY异常也是对象,所有异常继承自Exception,默认自动将所有异常名称放在内建空间,所以不必导入exceptions模块儿即可使用异常 AttributeError 试图访问一个对象没有的属性 EOFError 读取空文件...

满满李
2016/03/29
10
0
从1000多个项目中得到10个JavaScript错误以及如何避开它们

  我们将查看浏览器在JavaScript开发过程中所犯的最常见的错误,以及web开发人员可以如何避免这些错误。   为了回馈我们的开发者社区,我们查看了数千个项目的数据库,发现了JavaScript的...

爱码农
2018/02/04
0
0
javascript错误处理类型

在写javascript的时候,调试错误必不可少,除了能够在浏览器中打印出来错误外,常常还需要知道错误的类型是什么,以便对症下药的纠错;也有时候,在自己封装的工具函数中,不传参或传入了错误...

戎马
2018/08/27
0
0
【译】10 种 JavaScript 最常见的错误

原文:rollbar.com/blog/top-10… 声明:对原文稍作了修改,便于阅读 前言 看了数千个项目后,发现了 10 个最常见的 JavaScript 错误。我们会告诉你什么原因导致了这些错误,以及如何防止这些...

小生方勤
06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式Session的实现方式

JWT Token 使用 JWT Token 储存用户身份,然后再从数据库或者 cache 中获取其他的信息。这样无论请求分配到哪个服务器都无所谓。 Tomcat + Redis 在 tomcat 的配置文件中配置: <Valve class...

禅明
15分钟前
0
0
Android饼图 PieChart

PieChart 饼图,android 图表。会根据定义PieChartView的大小自动居中,所以如果要调整位置,只需要在xml更改PieChartView位置大小即可。 https://github.com/ccMagic/PieChart 1、先看一下效...

ccMagic
19分钟前
3
0
说说我当初是如何学Linux的

今天我就说说我当初是如何从一名普通桌面维护工程师,通过学习和努力转成Linux运维工程师的,以及作为Linux运维工程师需要一些什么技能和知识,希望可以帮到一些对Linux有兴趣或者想往Linux...

Linux就该这么学
20分钟前
2
0
Tomcat启动异常Unable to register MBean [HikariDataSource (null)]:InstanceAlreadyExistsException

Unable to register MBean [HikariDataSource (null)] with key 'xxx'; nested exception is javax.management.InstanceAlreadyExistsException: com.zaxxer.hik ari:name=baseDataSource,ty......

sunranhou
25分钟前
2
0
qt从普通线程发信号到UI线程

加入从当前一个普通线程发送信号到ui,更新Ui只能使用Qt::BlockingQueuedConnection,用Qt::QueuedConnection会一会有用一会没用,并且会导致崩溃。 connect(this, &Task::startTask, this, ...

青黑
46分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部