2010-09-15 17 views
1

我偶尔会遇到Flex框架引发的异常。通常来自呈现itemRenderer等的ListBase代码。我正在寻找技术来找出哪怕是我的ListBase实例甚至抛出错误。用于调试Flex Framework错误的技巧

困难在于当调用堆栈的顶部在callLaterDispatcher()

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at mx.controls.listClasses::ListBase/addToFreeItemRenderers() 
    at mx.controls.listClasses::ListBase/reduceRows() 
    at mx.controls.listClasses::ListBase/updateDisplayList() 
    at mx.controls.listClasses::TileBase/updateDisplayList() 
    at mx.controls.listClasses::ListBase/validateDisplayList() 
    at mx.managers::LayoutManager/validateDisplayList() 
    at mx.managers::LayoutManager/doPhasedInstantiation() 
    at Function/http://adobe.com/AS3/2006/builtin::apply() 
    at mx.core::UIComponent/callLaterDispatcher2() 
    at mx.core::UIComponent/callLaterDispatcher() 

源于看着一个断点我在ListBase中设置:: addToFreeItemRenderers,我可以看到,该项目是空这是被传递给函数,像这样:

protected function addToFreeItemRenderers(item:IListItemRenderer):void 
{ 
    // The following item is NULL when the exception is being thrown... 
    if (item == null) return; 

    DisplayObject(item).visible = false; 

    var factory:IFactory = factoryMap[item];  
... 

我如何找出我需要弄清楚?我之前已经解决了类似的问题,但是我必须使用魔法和巫术,并进行猜测并在我的代码中调用callLater调用来修复。

谢谢

+0

我要补充一点,我可以随时猴补丁检测ListBase和处理项目== NULL条件,但是这可能会最终导致了很多问题。 – taudep 2010-09-15 18:07:12

回答

0

我通常以调试模式启动应用程序。发生错误时,调试模式应该接管。

在调试模式下,您可以:

  1. 看堆栈跟踪并深入回落到有问题的部件。在某些情况下,如绑定或collectionChange事件,这将无济于事。正如你发现的那样,callLater使这个变得困难。

  2. 添加一个监视变量名称或ID,它可以告诉您组件的名称,您可以将它们绑定回该位置。如果你在多个地方使用同一个名字,这可能不是确定性的。

此外,当我遇到像这样的错误;他们往往是由于我做的事情,并纠正一些事情修复好的错误。然而,找出原因是很难的。

+0

我希望有更多的事情可以做。但这是我能想到的最好的:1)在基本的Flex框架代码中设置断点2)通过id或name属性追溯到父组件3)使用魔法来解决它。 – taudep 2010-09-15 20:44:04

1

我已经解决了与使用callLater这个问题 - 执行下列操作... 放置在UIComponent.callLater条件断点,在断点条件输入: 跟踪和中提琴 - 每一个(新的错误()的getStackTrace())。从任何地方拨打电话号码 将堆栈的黑暗边转储到跟踪中,以便在出现错误时检查它。

希望这会有所帮助。

Orri(奥瑞)斯科特

+0

哇,优秀的提示,希望我可以多次投票! – 2011-02-02 15:40:52