Класс Weapon определяет две переменные: power и numShots. Класс Bazooka, производный от класса Weapon, также содержит переменную numShots, которая замещает одноименную переменную родительского класса. Проблема с этим кодом заключается в том, что когда конструктор класса Bazooka вызывает конструктор класса Weapon (через функцию super()), инициализируется переменная numShots класса Weapon, a не класса Bazooka. При вызове метода blastEm() в классе Bazooka используется видимая переменная numShots, которая по умолчанию инициализируется нулем. Как вы, вероятно, можете представить, в более сложных классах подобные проблемы более серьезны.
Поэтому необходимо следить за тем, чтобы не скрывать переменные. Это не означает, что вы не должны их использовать, помните о риске, который влечет за собой использование таких переменных.
Обработка исключенийОдна из полезных стратегий предотвращения ошибок в Java – это обработка исключений. Эта методика основана на предотвращении появления неожиданных сообщений во время выполнения программы. Чтобы обработать «проблемный» код, его необходимо заключить в конструкцию try и обработать исключение командой catch. Событие «ошибка» по своей природе является исключением, а конструкция catch называется «обработчиком исключения».
Ниже приведен пример кода обработки исключений, который вы уже неоднократно встречали в книге:try {
//действия
}
catch (Exception e) {
System.err.println(e);
}В этом коде обрабатываемое исключение – это исключение типа Exception, общий тип для всех исключений. В некоторых случаях в ответ на возникшее исключение может понадобиться выполнить какие-нибудь действия, а не просто вывести сообщение об ошибке. Или вы можете никак не обрабатывать возникшее исключение, подобно тому, как это сделано в некоторых мидлетах в книге.
Совет Разработчику
Java поддерживает стандартные устройства ввода/вывода, которые можно использовать для отображения отладочной информации. System.err – это стандартное «устройство» ошибок, которое можно использовать для вывода ошибок в специальном окне или в командной строке эмулятора J2ME. Метод println() выводит строку в стандартное устройство.
Мы обсудили лишь малую часть обработки ошибок во время выполнения программы (исключений). Я настоятельно рекомендую более глубоко познакомиться с исключениями и их обработкой. К счастью, об обработке исключений в Java написано достаточно много, поэтому у вас не возникнет трудностей с поиском этой информации.
Выявление ошибок
Даже если вы применяли стратегии предотвращения ошибок, тем не менее вам придется отладить ряд ошибок. Программисты часто допускают ошибки, а высокая сложность многих мобильных игр вызывает проблемы. Просто поймите, что вы не идеальны, и сфокусируйтесь на поиске и устранении ошибок. Необходимо не только применять методы предотвращения ошибок, но и научиться отслеживать неминуемые погрешности, которые проявятся при тестировании игры. Давайте рассмотрим несколько методик поиска ошибок.
Использование стандартного вывода
Одна из самых старых методик поиска ошибок – это вывод отладочной информации на одно из устройств. Этот подход, вероятно, покажется вам архаичным, и во многом это так, однако он поможет быстро вникнуть, что происходит в игре.
Использовать стандартный прием вывода очень просто, например, вызовите метод System.out.println() в любом месте кода. Вы можете использовать стандартный вывод для выполнения многих задач – от отслеживания значений переменных до выявления запускаемых методов – просто вызовите метод println(), когда это нужно. Остерегайтесь вызывать метод println() в цикле обновления, например, внутри метода update(), который управляет анимацией мидлетов. В этом случае метод println() может замедлить работу мидлета, поскольку вывод текста на экран – достаточно медленная операция.