Отладка (статья написана для FLASH-5), страница 6

Остановимся на мгновение. Обратите внимание, что пройден почти весь код, и пока что все работает так, как и предполагалось. Переменная задана правильно, функция isTen( ) вызвана и получила правильный параметр.

СОВЕТ

Многие ошибки происходят потому, что код, который, как нам кажется, выполнялся, вообще не был достигнут! С помощью предложений trace( ) можно убедиться, что вход в некоторый участок кода был осуществлен.

Методом исключения выясняется, что проблема кода заключается либо в условном предложении if(val = 10), либо в присвоении текстовому полю status = "equal". Следующим проверяем условное предложение, выводя с помощью trace( ) значение условного выражения (предполагается true или false):

trace(val = 10);

Эврика! В окне Output выводится 10, а не true или false, как ожидалось.

При ближайшем рассмотрении выясняется, что условное выражение является присваиванием, а не сравнением! Пропущен знак равенства в операторе проверки равенства. Выражение if(val = 10) на самом деле должно иметь вид if(val == 10).

Очевидно, не все ошибки столь просты, как это условное предложение (которое является весьма распространенной ошибкой), но использованный подход применим в большинстве случаев поиска ошибки: выполнить ряд функций trace( ), чтобы создать текущий пошаговый отчет о фактическом выполнении кода и использовать отладчик, как советует Macromedia.

19.2.3. Часто встречающиеся причины программных ошибок

В таблице 19-1 перечислены некоторые часто встречающиеся причины программных ошибок в ActionScript.

Таблица 19-1. Ошибки, встречающиеся в ActionScript

Ошибка

Описание

Неверное расположение кода

Всякий код должен быть прикреплен к мувиклипу, кадру или кнопке. Следите, чтобы код был прикреплен туда, куда нужно, по заголовку панели Actions: если код прикреплен к кадру, заголовок панели будет Frame Actions; если код прикреплен к мувиклипу или кнопке, заголовок будет Object Actions. Если нужно расположить код в каком либо конкретном кадре, в начале написания кода следите за тем, чтобы этот кадр был выделен на шкале времени (Timeline) и чтобы этот кадр был ключевым. Если нужно, чтобы код был прикреплен к мувиклипу или кнопке, обеспечьте выделение соответствующего объекта на сцене перед началом ввода кода. Чтобы точно проследить, куда прикрепился, воспользуйтесь панелью Movie Explorer (Window Movie Explorer).

Отсутствие обработчика события

Код, прикрепленный к мувиклипам и кнопкам, обязан находится в обработчике события. Для мувиклипов используйте:

onClipEvent (событие) { 
    // предложения
}

Для кнопок:

on (событие) { 
    // предложения
}

где событие является именем обрабатываемого события. Ошибка "Statement must appear within on handler" указывает на отсутствие обработчика события. См. главу 10 "События и обработчики событий".

Неправильная ссылка на мувиклип

Ссылка на мувиклип, который не существует или имеет неверный формат. Проверьте, всем ли экземплярам даны имена и соответствуют ли эти имена указанным ссылкам. См. раздел 13.5.3 "Ссылки на вложенные мувиклипы" в главе 13 "Мувиклипы".

Непредусмотренное преобразование типа данных

Неожиданный результат преобразования данных. Например, 3 + "4" дает строку "34", а не число 7. Аналогично строка "true" преобразуется в булево значение false! См. правила преобразования типов данных в главе 3 "Данные и типы данных". Проверяйте типы данных с помощью оператора typeof.

Отсутствие точки с запятой

Предложение преждевременно завершено из-за отсутствия точки с запятой. О том, как правильно использовать точку с запятой, читайте в главе 14 "Лексическая структура".

Неверный символ кавычки

Строка содержит не преобразованный в escape-последовательность символ, конфликтующий со строковым литералом. См. раздел 4.5.2 "Строковые литералы" в главе 4 "Элементарные типы данных".

Неверное использование данных текстового поля

Текстовое поле используется как число или другой тип данных, отличный от строки. Значения, вводимые пользователем в текстовые поля, всегда являются строками (Strings) и должны быть вручную преобразованы для использования в качестве другого типа данных.

Проблемы области видимости

Ссылка на переменную, свойство или функцию не учитывает область видимости. Например, предложение в обработчике мувиклипа пытается вызвать функцию, областью видимости которой является шкала времени родителя этого мувиклипа. См. раздел 10.7 "Область видимости обработчика событий" в главе 10 "События и обработчики событий", раздел 2.5 "Область видимости переменных" в главе 2 "Переменные" и раздел 9.6 "Доступность и срок жизни функций" в главе 9 "Функции".

Смешение глобальной функции с методом

Имена некоторых глобальных функций совпадают с именами методов мувиклипов. Иногда это служит источником проблем. См. раздел 13.8.3.1 "Проблемы, связанные с перекрытием методов и глобальных функций" в главе 13 "Мувиклипы".

Не загружено содержимое

Ссылка на мувиклип, свойство, функцию или переменную не может быть разрешена, поскольку содержимое еще не загружено. Убедитесь в завершении загрузки с помощью свойства MovieClip._framesloaded, как показано в части III "Справочник по языку".

Неверное использование заглавных букв

В некоторых ключевых словах ActionScript учитывает регистр букв. Если ошибочно записать onClipEvent как onclipevent, ActionScript решит, что вызывается пользовательская функция onclipevent, а не используется ключевое слово встроенного обработчика события onClipEvent. В результате будет сообщено об ошибке при обнаружении { в начале блока предложений onClipEvent (интерпретатор ищет точку с запятой, обозначающую конец того, что он считает вызовом функции onclipevent). См. раздел 14.6 "Чувствительность к регистру" в главе 14 "Лексическая структура".