Методы отладки ошибок Flex Framework - PullRequest
1 голос
/ 15 сентября 2010

Время от времени я сталкиваюсь с исключением, создаваемым платформой Flex.Часто из ListBase кода, который отображает itemRenderers и тому подобное.Я ищу методы, чтобы использовать, чтобы выяснить, какой из моих экземпляров ListBase генерирует ошибку.

Сложность возникает, когда начало стека вызовов происходит в 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, я вижу, что элемент имеет значение null, которое передается функции, как показано ниже:

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 в мой код для исправления.

Спасибо

Ответы [ 2 ]

1 голос
/ 17 января 2011

Я решил эту проблему с callLater - сделайте следующее ... Поместите условную точку останова в UIComponent.callLater, в условие точки останова введите: trace (new Error (). getStackTrace ()) и альт - каждый вызов callLater из любого места будет сбросьте темную сторону стека на трассировку, чтобы вы могли проверить ее при появлении ошибки.

Надеюсь, это поможет.

Орри Скотт

0 голосов
/ 15 сентября 2010

Я обычно запускаю приложение в режиме отладки. При возникновении ошибки режим отладки должен вступить во владение.

В режиме отладки вы можете:

  1. Посмотрите на трассировку стека и вернитесь к рассматриваемому компоненту. В некоторых случаях, таких как события binding или collectionChange, это не поможет. Как вы обнаружили, callLater делает это трудным.

  2. Добавьте имя переменной переменной или идентификатор, который может сообщить вам имя компонента, которое вы можете привязать к местоположению. Если вы используете одно и то же имя в нескольких местах, это может быть не окончательным.

За гранью, когда я сталкиваюсь с такими ошибками; они часто происходят из-за того, что я сделал, и исправление этого исправляет ошибку навсегда. Тем не менее, это может быть трудно понять, в чем причина.

...