2010-09-15 21 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