int a = 37, b = 26;
int n = ((a % 3) + (b / 7)) ^ 8;
Скрытые переменные класса
Другая ошибка, которая свойственна объектно-ориентированному программированию игр – это сокрытые переменные класса. Сокрытые переменные могут «потеряться», если в производном классе есть новая одноименная переменная. Взгляните на код, приведенный в листинге 16.1. Он реализует два класса Weapon и Bazooka.
Листинг 16.1. Классы Weapon и Bazooka
class Weapon {
int power;
int numShots;
public Weapon() {
power = 5;
numShots = 10;
}
public void fire() {
numShots–; //Переменная numShots в классе Weapon определена
}
}
class Bazooka : extends Weapon {
int numShots; //Переменная numShots скрывает переменную numShots родительского класса Weapon
public Bazooka() {
super();
}
public blastEm() {
power–;
numShots -= 2; //Переменная numShots класса Bazooka увеличивается, в то время как сокрытая переменная numShots класса Weapon остается неизменной
}
}
Класс 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() может замедлить работу мидлета, поскольку вывод текста на экран – достаточно медленная операция.
Читать дальше
Конец ознакомительного отрывка
Купить книгу