Making sense of Flash compile-time and run-time errors
Posted on 29th January 2010 in Flash | 2 Comments »
Every new version of ActionScript has had its impact on the compiler and error handling. Since ActionScript 1, that had loose typing and was suited well for small-scale scripting projects, things have changed considerably.
With ActionScript 2 Flash community first saw the compile-time type checking and class-based syntax which basically allowed Object-oriented programming approaches. Despite the class-based inheritance that took AS2 closer to Java for instance, compiling still took it to AS1 bytecode over legacy matters. So basically the class-based inheritance that allowed the OOP approach was a layer on top of the existing prototype-centric AS1.
With Flex 2 and ActionScript 3 the scripting language changed a lot. The whole thing was restructured and new AS3-specific virtual machine (AVM2) was introduced. For those working in Flash IDE prior this era, it changed a lot. With a “habit” of procedural programming they had to rethink it. On the new platform, even if compile-time errors made sense referring to the line error occurred at, run-time errors didn’t really help them out much, e.g.:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
or slightly better
ReferenceError: Error #1069: Property property0 not found on Doc and there is no default value.
but also without a line number. Something that can be understood at run-time, we’re dealing with bytecode.
Nevertheless the situation is a bit similar to Java and you can actually quickly scope the above error using the call stack backtrace:
ReferenceError: Error #1069: Property property0 not found on Doc and there is no default value. at Doc/handleTimerResult() at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.utils::Timer/tick()
so it runs up to handleTimerResult and then gets stuck. A quick dive into the (illustrative) code reveals that the trace is trying to access property0 during the while iteration at line 51.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | package { import flash.display.MovieClip; import flash.utils.Timer; import flash.events.TimerEvent; public class Doc extends MovieClip { public var property1:uint; public var property2:uint; private var timer:Timer; public function Doc() { init(); } private function init():void { trace("Doc Class initilized!"); setProperties(); initTimer(); } private function setProperties():void { setProperty1(); setProperty2(); } public function setProperty2():void { property2 = randomOf100(); trace("2nd property set to "+property2); } public function setProperty1():void { property1 = randomOf100(); trace("1st property set to "+property1); } private function randomOf100():uint { return Math.random() * 100; } private function initTimer():void { timer = new Timer(1000, 5); timer.addEventListener(TimerEvent.TIMER, handleTimer); timer.addEventListener(TimerEvent.TIMER_COMPLETE, handleTimerResult); timer.start(); } private function handleTimerResult(event:TimerEvent):void { var i:int = 3; while (i--) { trace("Property "+i+": "+this['property'+i]); // run-time error } } private function handleTimer(event:TimerEvent):void { setProperty1(); setProperty2(); trace("Properties reset!"); } } } |
In most cases, if a class is structured reasonably, the above logic should deliver nicely. If this is not the case, in Flash IDE, instead of the regular Cmd/Ctrl + Enter “Test Movie” functionality, you also have “Debug Movie”. It will launch standalone Flash Player and provide you with the line number in the backtrace:
ReferenceError: Error #1069: Property property0 not found on Doc and there is no default value. at Doc/handleTimerResult()[/Users/[...]/Doc.as:51] at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at flash.utils::Timer/tick()
In addition to the above there are loads of tools out there, e.g. MonsterDebugger. Check out Lee Brimelow’s Debugging with MonsterDebugger video tutorial for more.
Related references:


2 Responses
I have not used the debugger in quite awhile. What would you do if you got the “TypeError: Error #1009: Cannot access a property or method of a null object reference.” at run-time? (Which was the case with me awhile ago…)
I’m sure the method
TypeErrorappeared at tried to establish a reference to non-existing property/method of the class. I’d simply check the call stack backtrace for the error.