TypeError 1009,XML和AS3

时间:2010-03-25 14:30:17

标签: xml flash actionscript-3

我的动画向前推进,但它被冻结了。它抛出一个TypeError 1009.如何摆脱这个错误并让它发挥?

下载
http://sandboxfun.weebly.com/

XML

<?xml version="1.0" encoding="utf-8"?>
<SESSION>
 <TIMER TITLE="speed">1000</TIMER>
 <COUNT TITLE="starting position">10000</COUNT>
</SESSION>

FLA

//DynamicText 'Count'
 var timer:Timer = new Timer(10);  
 var count:int = 0;
 var fcount:int = 0; 

timer.addEventListener(TimerEvent.TIMER, incrementCounter);  
 timer.start();  

function incrementCounter(event:TimerEvent) { 
 count = myXML.COUNT.text();
 count++;  
 fcount=int(count*count/1000);
 mytext.text = formatCount(fcount);
 }

function formatCount(i:int):String { 
 var fraction:int = i % 100; 
 var whole:int = i / 100;  

 return ("0000000" + whole).substr(-7, 7) + "." + (fraction < 10 ? "0" + fraction : fraction); 
 } 

//LOAD XML
 var myXML:XML;
 var myLoader:URLLoader = new URLLoader();
 myLoader.load(new URLRequest("time.xml"));
 myLoader.addEventListener(Event.COMPLETE, processXML);
  /*------CHANGED TIMER VALUE WITH XML------*/
  timer = new Timer( Number(myXML.TIMER.text()) );
  //timer.start();

//PARSE XML
function processXML(e:Event):void {
 myXML = new XML(e.target.data);
  trace(myXML.COUNT.text()); 
  trace(myXML.TIMER.text()); 
 }
//var count:int = 0;//give it a value type
 /*------CHANGED COUNT VALUE WITH XML------*/
 count = myXML.COUNT.text();

错误

  

TypeError:错误#1009:无法访问null的属性或方法   对象参考。
          at _fla :: MainTimeline / frame1()
TypeError:错误#1009:无法访问空对象引用的属性或方法。
at   _fla :: MainTimeline / incrementCounter()
在flash.utils :: Timer / _timerDispatch()
在   flash.utils ::定时器/蜱()

1 个答案:

答案 0 :(得分:2)

你在之前的一个问题中犯了同样非常简单的错误,这表明你还没有非常牢固地掌握你的代码执行方式,顺序等等。我已经完成了它并摆脱了错误,但代码除了显示一些数字之外什么都不做。我不知道这是不是我的目标。

在我粘贴代码之前,请先注意一些代码。首先,再一次非常混乱。我已经正确格式化了,但我不会再用你的代码那样做了。保持代码格式化是世界上最简单的事情,并且在尝试解释代码时,它确实让其他人的生活更轻松。我真的,强烈建议你真正开始这样做。

其次,您的代码问题以及您获得的错误是由于尝试访问您尚未设置的变量的内容而导致的。主要的罪魁祸首是你的myXML对象,在你运行processXML函数之前,你试图在incrementCounter中访问它。这是相当基础的,你应该学习代码的执行方式,以避免类似的问题。另外,如果你直接在时间轴上编码,我会避免在函数之间放置变量声明,它可以和非常混乱。将所有声明放在顶部,然后调用一些将使事情顺利进行的函数,并在下面显示您的函数。我已重新安排您的代码以反映此建议。

最后,使用Flash的有限调试器通常可以非常容易地诊断这些类型的错误('无法访问null的属性或方法'等)。从Flash中的“调试”菜单运行“调试影片”。调试器的优点是它不仅会在“输出”窗口中显示错误,而且会在导致错误的代码行停止,因此您可以看到问题所在。甚至还有一个窗口显示当前范围内的所有变量,因此您可以看到哪个是null,或者其他什么。使用此功能,您可以自己修复这些错误;像这样的TypeErrors通常不适合在论坛上发布。当然,如果你真的被卡住了,你应该问一下,但是了解如何自己解决这些问题是很好的,你的很多帖子都在重复相同的问题。

无论如何,修改后的代码:

//DynamicText 'Count'
var timer:Timer = new Timer(10);  
var count:int = 0;
var fcount:int = 0; 

//LOAD XML
var myXML:XML;
var myLoader:URLLoader = new URLLoader();
myLoader.load(new URLRequest("time.xml"));
myLoader.addEventListener(Event.COMPLETE, processXML);
/*------CHANGED TIMER VALUE WITH XML------*/
//timer.start();

function incrementCounter(event:TimerEvent) 
{ 
    //Before, this function was being called before 
    //you had read in your XML file, so myXML was empty.
    count = myXML.COUNT.text();
    count++;  
    fcount=int(count*count/1000);
    mytext.text = formatCount(fcount);
}

function formatCount(i:int):String 
{ 
    var fraction:int = i % 100; 
    var whole:int = i / 100;  

    return ("0000000" + whole).substr(-7, 7) + "." + (fraction < 10 ? "0" + fraction : fraction); 
} 


//PARSE XML
function processXML(e:Event):void 
{
    myXML = new XML(e.target.data);
    trace(myXML.COUNT.text()); 
    trace(myXML.TIMER.text()); 
    count = myXML.COUNT.text();

    //I put this here, so that this timer's event will only be 
    //created once myXML is initialised with XML data.
    timer = new Timer( Number(myXML.TIMER.text()) );
    timer.addEventListener(TimerEvent.TIMER, incrementCounter);  
    timer.start();  
}