| Работа над ошибками-2 |
|
|
Sunday, 12 March 2006 | Administrator для раздела Ученье – свет От редакции IsraMir’а. Это чрезвычайно это полезная и нужная ведь: «разбор полетов», особенно, когда речь идет о начинающих изучать любое дело, в том числе и работу на Java. Именно поэтому материал, который я нашел и предлагаю вам сегодня (частично), показался мне очень полезным. Естественно, что наши решпекты и благодарности автору и владельцам сайта – на этот раз SQL.ru. Сегодня - часть вторая на эту тему.6. Забыл вызвать конструктор родителя (суперкласса).
Когда класс расширяет другой класс, каждый конструктор подкласса должен вызвать какой-либо конструктор суперкласса. Обычно это достигается вызовом конструктора суперкласса методом super(x), помещенным в первой строке конструктора. Если в первой строке конструктора нет вызова super(x), компилятор самостоятельно вставляет этот вызов, но без параметров: super().
Иногда студенты забывают об этом требовании. Обычно это не является проблемой: вызов конструктора суперкласса вставляется компилятором и все работает отлично. Однако если у суперкласса нет конструктора по умолчанию (прим. перев.: то есть конструктора без параметров), то компилятор выдаст ошибку. В примере ниже все конструкторы суперкласса java.io.File имеют 1 или 2 параметра:
Ошибочный пример:
Решением проблемы является вставка явного вызова правильного конструктора суперкласса:
Исправленный пример:
Более неприятная ситуация возникает, когда у суперкласса есть конструктор по умолчанию, но он не полностью инициализирует объект. В таком случае код скомпилируется, но результат работы программы может быть неправильным или может возникнуть исключение.
7. Неправильный перехват исключений
Система обработки исключений в Java достаточно мощная, но трудная для понимания новичками. Студенты, хорошо владеющие C++ или Ada, обычно не испытывают сложностей, в отличие от программистов C и Fortran. Примеры ниже показывают некоторые распространенные ошибки.
В данном примере для исключения не указано имя. На эту ошибку укажет компилятор на этапе компиляции, так что ее легко исправить самостоятельно.
Ошибочный пример:
Исправленный пример:
Порядок расположения блоков catch определяет очередность перехвата исключений. Нужно учитывать, что каждый такой блок перехватит все исключения указанного класса или любого его подкласса. Если не учесть это, то можно получить недостижимый блок catch, на что укажет компилятор. В примере ниже SocketException является подклассом IOException.
Ошибочный пример:
Исправленный пример:
Если в коде возможно появление исключения, которое не перехватавается ни одним блоком try-catch, то это исключение следует объявить в заголовке метода. (Для исключений - подклассов класса RuntimeException это не обязательно). Студенты иногда забывают о том, что вызов метода может порождать исключение. Проще всего это исправить, помещая вызов метода в блок try-catch.
Ошибочный пример:
Исправленный пример:
8. Метод доступа имеет тип void
Это очень простая ошибка. Студент создает метод для доступа к переменной, но указывает, что метод ничего не возвращает (помещает модификатор void в загогловок метода). Чтобы исправить эту ошибку, нужно указать правильный тип возвращаемого значения.
Ошибочный пример:
Исправленный пример:
Указание неправильного возвращаемого типа порождает целый класс ошибок. Обычно компилятор распознает эти ошибки и сообщает о них, так что студенты могут самостоятельно их исправить.
|
|||||||||||