Ошибки — это неизбежная часть процесса обучения. Однако, если у вас возникают трудности с пониманием того, как и где исправить ошибки в моделях AnyLogic, мы готовы вам помочь. Данная статья является руководством, к которому вы можете обратиться при возникновении проблем.
Статья основана на недавнем вебинаре и посвящена рекомендуемым стратегиям использования комплексных инструментов для построения моделей в AnyLogic, доступных всем пользователям.
Поэтому в данном руководстве не рассматривается режим отладки AnyLogic, который позволяет приостановить и возобновить программу, проверить переменные и вычислить выражения. Этот режим доступен только в AnyLogic Professional и в основном полезен в моделях, в которых присутствует большое количество кода.
В статье мы рассмотрим:
- Навигацию по модели
- Ошибки компиляции
- Cannot be resolved
- The method is not applicable
- Type mismatch
- Syntax error
- Unreachable code
- The method is undefined
- Statechart specific errors
- Ошибки при выполнении модели
Навигация по модели
Если вы новичок в AnyLogic, перед тем как двигаться дальше, вам следует ознакомиться с несколькими ключевыми элементами интерфейса.
В верхней части экрана находятся Menu и Toolbar. Слева направо отображаются следующие основные компоненты:
- Панель Projects – здесь расположены все ваши открытые модели. Если вы новичок, лучше оставить одну модель открытой, чтобы не запутаться.
- Панель Palette – содержит список всех элементов, которые могут быть добавлены на диаграмму агента для построения моделей.
- Graphical editor или Canvas – пространство, на которое вы перетаскиваете элементы из Palette для создания не только логической структуры модели, но и её визуального представления.
- Панель Properties – здесь отображаются свойства выбранных элементов модели.
На панели Projects элементы модели сортируются по разным категориям, что позволяет легко ориентироваться при поиске. Чтобы открыть агента в Graphical editor, дважды кликните по нему. Он появится на новой вкладке и будет выделен жирным шрифтом на панели Projects. Это позволяет всегда знать, где вы находитесь в модели.
Внизу находится Status bar и два окна – Console и Problems. Этим двум элементам будет уделено основное внимание в данной статье, поскольку именно они помогают при работе с ошибками.
Поиск элементов модели
Допустим, вы хотите найти не агента, а конкретный элемент, принадлежащий этому агенту на панели Canvas. При первом двойном щелчке откроется соответствующий агент. При втором двойном клике искомый элемент в данном агенте будет выделен.
Другой способ поиска элементов – через кнопку Search (Ctrl + F для Windows или Command + F для Mac).
Именно эти способы поиска элементов в модели понадобятся вам при работе с ошибками и проблемными элементами.
Ошибки компиляции
Они обнаруживаются в процессе компиляции и генерации кода. Такие ошибки появляются еще до запуска модели и отображаются на панели Problems.
В процессе построения модели всегда можно нажать кнопку Build model (или F7), чтобы найти ошибки во всех моделях, которые у вас есть на панели Projects. Если таковые имеются, то рядом со значком модели появится небольшой красный крестик.
Откройте панель Problems в нижней части экрана в AnyLogic, чтобы увидеть все обнаруженные ошибки. Чтобы отфильтровать их, воспользуйтесь функциями Filter problems by model (нажмите на кнопку, а затем на модель на панели Projects) или Filter problems by selection (нажмите на кнопку, а затем на агента на панели Projects, которого вы хотите проверить на ошибки).
Рассмотрим проблемы компиляции, возникшие в примерах моделей на вебинаре.
Ошибка компиляции 1: "[NAME] cannot be resolved… (…to a variable/…or is not a field)"
Это сообщение может означать следующее:
- что-то не так с именем, на которое вы ссылались, из-за чего AnyLogic не может его обработать. Обычно это вызвано опечаткой или переименованием объекта без рефакторинга;
- тип объекта не был указан.
Ниже приведены несколько сценариев для устранения данной ошибки.
Разрешение имён: имя вызываемого элемента неверно
Ошибка указывает на проблему с именем популяции агентов, на которую вы ссылались. По замыслу автора модели, блок Source должен был ссылаться на совокупность агентов под названием Customers. Поэтому в данном случае вы можете просто удалить mypopulation и из выпадающего меню выбрать предложенное имя популяции – Customers.
Теперь, если вы снова нажмете кнопку Build model (или F7), вы увидите, что ошибка устранена. Попробуйте сделать это самостоятельно с демо-примером ошибки – name resolution [ZIP].
Разрешение имён: опечатка
Опечатка – одна из самых трудноуловимых ошибок. Иногда, на первый взгляд, кажется, что опечаток нет, поэтому есть прием, который поможет вам с этим.
Намерение автора модели здесь заключалось в том, чтобы добавить время, которое агенты потратили на прохождение по блок-схеме, в гистограмму. Однако, AnyLogic не согласен с именем, содержащимся в коде.
В этом случае можно оставить ту часть имени, в которой вы уверены, затем вызвать автодополнение кода (Ctrl + Space или Option + Space) и выбрать правильный вариант из предложенных.
Теперь, если вы снова нажмете Build model (или F7), вы увидите, что ошибка устранена. Попробуйте сделать это самостоятельно с демо-примером ошибки – name resolution [ZIP].
Разрешение имён: имя не отображается в автодополнении кода
Вы замечаете ошибку, которая указывает на проблему в названии переменной или функции. Пытаясь исправить это с помощью автодополнения кода, вы не находите нужный вариант. Если же нужный элемент отображается на панели Canvas, но не предлагается в автодополнении, убедитесь, что он не помечен как Ignore.
Чтобы решить проблему, снимите галочку с опции Ignore и нажмите Build model (или F7). Теперь проверьте, исчезла ли ошибка. Попробуйте сделать это самостоятельно с демо-примером ошибки – name resolution [ZIP].
Разрешение поля имён: неверное имя параметра
Ошибка указывает на то, что имя параметра Task priority: priority_value неверно. Если речь идет об агенте типа Customer, искать решение нужно среди элементов данного агента.
Оказывается, есть параметр с именем priority_level, который вам и нужен. Измените имя в параметре Task priority и нажмите Build model (или F7), чтобы увидеть, исчезла ли ошибка. Попробуйте сделать это самостоятельно с демо-примером ошибки – name field resolution [ZIP].
Разрешение поля имён: тип объекта не указан
Unit указывает на ресурсный блок под названием employeePool. Если вы ищете элемент с названием skill_rating в агенте Employee, то увидите его там, поэтому проблема не в названии, как это было в предыдущих примерах.
Если ошибка была найдена в блоке Seize и вы ссылаетесь на агент типа Employee, убедитесь, что был указан тип единицы. Сначала вам нужно привести конкретную единицу: (Employee)unit. Затем укажите, что skill_rating относится ко всему объекту ((Employee)unit).skill_rating.
Попробуйте сделать это самостоятельно с демо-примером ошибки – name field resolution [ZIP].
Ошибка компиляции 2: "Метод [FUNCTION(ARG)] в типе [OBJECT_TYPE] неприменим для аргументов [(ARG)]"
Такая ошибка происходит, когда аргумент, который вы передаете методу или функции, не соответствует ожидаемому.
Пользователь установил тип аргумента как double, но в блоке Delay передал только одно значение. Для решения данной проблемы необходимо добавить второе значение.
Попробуйте сделать это самостоятельно с демо-примером ошибки – name field resolution [ZIP].
Ошибка компиляции 3: "Несоответствие типов: невозможно преобразовать [TYPE_A] в [TYPE_B]"
Данная ошибка возникает, если в модели имеется переменная неправильного типа.
В данном случае проблема заключается в условии блока SelectOutput для агента Customer. Вы обнаружите, что Type указан как Double, хотя поле Condition в блоке SelectOutput требует Boolean. Простое изменение типа решает проблему.
Попробуйте сделать это самостоятельно с демо-примером ошибки – type mismatch [ZIP].
Ошибка компиляции 4: "Синтаксическая ошибка, [MESSAGE]"
Ошибки компиляции такого типа легко понять. Рассмотрим наиболее распространённые из них и способы их решения.
- Синтаксическая ошибка в лексеме")", удалите лишний знак. Это значит, что присутствует лишний символ, который нужно удалить.
- Синтаксическая ошибка, вставьте ")" для завершения выражения (Expression). У вас отсутствует символ в Expression. Expression — это комбинация переменных, операторов и функций, которая вычисляется в одну переменную. Например, при объявлении переменной result следующим образом: int result = 2 * (3+4); выражением будет 2 * (3+4).
- Синтаксическая ошибка, вставьте ";" для завершения выражения (Statement). У вас отсутствует символ в Statement. Statement — это полная единица исполнения в Java. Она может выполнять действие или изменять состояние. Пример: int age = 25;
- Синтаксическая ошибка, вставьте "}" для завершения BlockStatements. У вас отсутствует символ в Block Statements. Block Statements — это группа операторов в фигурных скобках {}.
Ошибка компиляции 5: "Недостижимый код"
Если вы видите эту ошибку, это означает, что после завершающего символа ";" в коде присутствует лишний символ.
Ошибка компиляции 6: "Метод [FUNCTION_NAME] не определен для типа [OBJECT_TYPE]"
Эта ошибка тоже довольно проста. Она может возникнуть из-за вызова функции, которая не существует для определенного типа объекта. Обычно это происходит из-за опечатки.
Ошибка компиляции 7: ошибки компиляции, специфичные для statecharts
Существуют определенные логические правила, которые должны соблюдаться в statecharts. Наиболее распространёнными ошибками являются:
- Hanging statechart entry. Точка входа ни с чем не связана, но если добавить состояние из палитры, то ошибка исчезнет.
- Branch state without outgoing transitions. Достаточно добавить новый переход от Branch к другому элементу.
Ошибки, возникающие при выполнении модели
Они возникают во время выполнения модели и связаны с языком программирования Java или же с недочетами в логической структуре. Подробные сведения о каждой ошибке можно увидеть в Console.
Ошибка при выполнении модели 1: "Agent cannot leave port [NAME], it has no connections"
Эта ошибка в логической структуре симуляции связана с дискретно-событийными блок-схемами.
В этом случае вы получите сообщение "Agent cannot leave port root.shortDelay.out", следовательно вам нужно добавить блок Delay или Sink. Попробуйте сделать это самостоятельно с демо-примером ошибки – no port connection [ZIP].
Ошибка при выполнении модели 2: "An agent was not able to leave the port [NAME] at time [TIMESTAMP]/ date [DATESTAMP]"
Эта ошибка связана с логической согласованностью в симуляции и в структуре блок-схем. Обычно она вызвана блоком Source при заполнении блока до максимальной ёмкости.
Чтобы исправить ошибку, можно увеличить ёмкость вручную или использовать протокол Pull. Попробуйте сделать это самостоятельно с демо-примером ошибки – leave port [ZIP].
Ошибка при выполнении модели 3: "[TYPE_A] cannot be cast to [TYPE_B]"
Эта ошибка относится к коду на языке Java и возникает, когда вы пытаетесь привести тип агента к несовместимому типу при выполнении модели.
У вас в модели имеются два разных типа агентов: EmployeePrimary и EmployeeBackup. Оба типа управляются через ресурсные пулы в Main.
Но когда вы запускаете модель, она пытается преобразовать EmployeePrimary в EmployeeBackup, что вызывает ошибку. Для решения данной ошибки необходимо запросить модель проверить фактический класс единицы. Для это нужно добавить условие в параметр Unit rating в блоке Seize.
Попробуйте сделать это самостоятельно с демо-примером ошибки – incorrect casting [ZIP].
Ошибка при выполнении модели 4: "NullPointerException"
Она срабатывает, когда вы пытаетесь выполнить операцию непосредственно с нулевым значением ("null" — это ключевое слово в Java, которое указывает на отсутствие значения).
Попробуйте сделать это самостоятельно с демо-примером ошибки – null pointer exception [ZIP].
Ошибка при выполнении модели 5: "IndexOutOfBoundsException"
Она возникает, когда вы пытаетесь получить доступ к коллекции (например, массиву или списку) по недопустимому индексу, основанному на размере этой коллекции. Правильный индекс не должен быть меньше 0 или больше размера коллекции.
Попробуйте сделать это самостоятельно с демо-примером ошибки — index out of bounds [ZIP].
Заключение
В данной статье мы подробно рассмотрели ряд наиболее распространенных ошибок на этапе компиляции и при выполнении модели, с которыми вы, вероятно, столкнетесь на начальных этапах работы в AnyLogic. Обращая внимание на рекомендации, изложенные в данной статье, вы сможете с гораздо большей уверенностью приступить к решению сложных задач. Дополнительные материалы и рекомендации вы всегда найдете в разделе "Справка AnyLogic: Устранение ошибок".
И помните, что вы всегда можете обратиться к сообществу AnyLogic на платформе StackOverflow. Там вы найдёте ответы на многие вопросы и сможете обменяться опытом с другими специалистами.
Хотите быть в курсе последних новостей? Подпишитесь на нашу ежемесячную новостную рассылку, чтобы получать свежие статьи из нашего блога прямо к вам на почту.