Pull to refresh

Ошибка — совпадение имён классов

Reading time3 min
Views777
Недавно я потратил почти целый день на поиск одной ошибки. Может быть, кому-нибудь пригодится мой опыт.

Итак, ситуация. Структура системы примерно такова. Есть SWF (назовём его загрузчиком), который загружает другие SWF-ы (назовём их модулями). Один из модулей, над которым я и работаю, загружает, в свою очередь, ещё один SWF – назовём его игрой. Загрузчик пишет один программист, игру другой программист, ну а модуль — я. Расклад довольно типичный для разработки виртуальных миров.

Запускать весь комплекс на машине разработчика муторно и проблематично, поскольку загрузчик привязан к многим вещам на сервере. Поэтому обычно я у себя тестирую только модуль в связке с игрой, тем более что взаимодействие с загрузчиком сведено до минимума и давно отработано. Запускаю модуль локально — всё работает прекрасно. Загружается игра, модуль приводит ее к некоторому интерфейсу, вызывает методы — короче, всё путём. Загружаю на сервер — и получаю ошибку. Достаточно быстро выясняется, что ошибка происходит потому, что не получается привести загруженный объект к требуемому интерфейсу.

Я предположил, что происходит ошибка при загрузке — но нет, Loader ничего такого не сообщал. Загружалась игра вот так:

_loader = new Loader();
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete, false, 0, true); _loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onErrorLoading, false, 0, true);
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.NETWORK_ERROR, onErrorLoading, false, 0, true);
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.VERIFY_ERROR, onErrorLoading, false, 0, true);

_loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityErrorLoading, false, 0, true);
_loader.load(new URLRequest(fileLocation));


В методе onLoadComplete происходило вот что:

log.debug("loader info content type:"+_loader.contentLoaderInfo.contentType);
log.debug("loader info URL:"+_loader.contentLoaderInfo.url);
log.debug("loader content:"+_loader.content);

game = _loader.content as MyGameInterface;


Метод onErrorLoading не вызывался, срабатывал onLoadComplete. У меня на машине, где всё работало, в лог выдавалось следующее:
10:33:00:453 [DEBUG] loader info content type:application/x-shockwave-flash
10:33:00:453 [DEBUG] loader info URL:file:///C|/Projects/[... путь...]/Main.swf
10:33:00:453 [DEBUG] loader content:[object Main]


На сервере же картина была вот такая:
12:01:03:375 [DEBUG] loader info content type:application/x-shockwave-flash
12:01:03:375 [DEBUG] loader info URL:[... правильный путь к файлу...]
12:01:03:375 [DEBUG] loader content:instance43942.instance43943


Видно, что разница в content: в одном случае получается некий объект, а в другом — какие-то невразумительные инстансы. Но в чём дело?

Вот тут я застрял. Мучил разработчика игры, заставлял его проверять разные режимы компиляции (с поддержкой сети и без), проверял версии файлов, проверял настройки безопасности — всё без толку.

Наконец меня осенило, и я полез в код игры и код загрузчика. Оказалось, что и там и там программисты назвали основной класс Main и положили его в default package. Понятно, что SWF игры грузился без проблем, а вот загрузить оттуда класс не получалось. Я высказал разработчикам всё, что думаю, разработчик игры перетащил Main в нужный пакет, и вся конструкция заработала как часы.

Самое в этом любопытное, что флэш-плеер никак про эту ситуацию не сообщил. Просто молча проигнорировал.

Надеюсь, что мой отчёт сэкономит кому-нибудь время на борьбу с этой необычной ошибкой.
Tags:
Hubs:
Total votes 8: ↑6 and ↓2+4
Comments6

Articles