Авторские Материалы о событиях в Израиле на Ближнем Востоке и в мире

IsraMir.com - Израильская журналистика

Default color brown color green color red color blue color
Вы сейчас тут: Новости arrow Техотдел arrow Свет ученья arrow Работа над ошибками-2
Skip to content
Работа над ошибками-2 Версия для печати Отправить на e-mail
Sunday, 12 March 2006 | Administrator для раздела Ученье – свет
Работанадошибками-2isramir.comОт редакции IsraMir’а. Это чрезвычайно это полезная и нужная ведь: «разбор полетов», особенно, когда речь идет о начинающих изучать любое дело, в том числе и работу на Java. Именно поэтому материал, который я нашел и предлагаю вам сегодня (частично), показался мне очень полезным. Естественно, что наши решпекты и благодарности автору и владельцам сайта – на этот раз SQL.ru. Сегодня - часть вторая на эту тему.
 
 
 
 
6. Забыл вызвать конструктор родителя (суперкласса).
 
Когда класс расширяет другой класс, каждый конструктор подкласса должен вызвать какой-либо конструктор суперкласса. Обычно это достигается вызовом конструктора суперкласса методом super(x), помещенным в первой строке конструктора. Если в первой строке конструктора нет вызова super(x), компилятор самостоятельно вставляет этот вызов, но без параметров: super().
 
Иногда студенты забывают об этом требовании. Обычно это не является проблемой: вызов конструктора суперкласса вставляется компилятором и все работает отлично. Однако если у суперкласса нет конструктора по умолчанию (прим. перев.: то есть конструктора без параметров), то компилятор выдаст ошибку. В примере ниже все конструкторы суперкласса java.io.File имеют 1 или 2 параметра:
 
Ошибочный пример:
public class JavaClassFile extends File {
 
    String classname;
 
    public JavaClassFile(String cl) {
 
        classname = cl;
 
    }
 
}
 
 
Решением проблемы является вставка явного вызова правильного конструктора суперкласса:
 
Исправленный пример:
public class JavaClassFile extends File {
 
    String classname;
 
    public JavaClassFile(String cl) {
 
        super(cl + ".class");
 
        classname = cl;
 
    }
 
}
 
 
Более неприятная ситуация возникает, когда у суперкласса есть конструктор по умолчанию, но он не полностью инициализирует объект. В таком случае код скомпилируется, но результат работы программы может быть неправильным или может возникнуть исключение.
 
 
7. Неправильный перехват исключений
 
Система обработки исключений в Java достаточно мощная, но трудная для понимания новичками. Студенты, хорошо владеющие C++ или Ada, обычно не испытывают сложностей, в отличие от программистов C и Fortran. Примеры ниже показывают некоторые распространенные ошибки.
 
В данном примере для исключения не указано имя. На эту ошибку укажет компилятор на этапе компиляции, так что ее легко исправить самостоятельно.
 
Ошибочный пример:
try {
 
    stream1 = new FileInputStream("data.txt");
 
} catch (IOException) {
 
    message("Could not open data.txt");
 
}
 
 
Исправленный пример:
try {
 
   stream1 = new FileInputStream("data.txt");
 
} catch (IOException ie) {
 
   message("Could not open data.txt: " + ie);
 
}
 
 
 
Порядок расположения блоков catch определяет очередность перехвата исключений. Нужно учитывать, что каждый такой блок перехватит все исключения указанного класса или любого его подкласса. Если не учесть это, то можно получить недостижимый блок catch, на что укажет компилятор. В примере ниже SocketException является подклассом IOException.
 
Ошибочный пример:
try {
 
    serviceSocket.setSoTimeout(1000);
 
    newsock = serviceSocket.accept();
 
} catch (IOException ie) {
 
    message("Error accepting connection.");
 
} catch (SocketException se) {
 
    message("Error setting time-out.");
 
}
 
 
Исправленный пример:
try {
 
    serviceSocket.setSoTimeout(1000);
 
    newsock = serviceSocket.accept();
 
} catch (SocketException se) {
 
    message("Error setting time-out.");
 
} catch (IOException ie) {
 
    message("Error accepting connection.");
 
}
 
 
 
Если в коде возможно появление исключения, которое не перехватавается ни одним блоком try-catch, то это исключение следует объявить в заголовке метода. (Для исключений - подклассов класса RuntimeException это не обязательно). Студенты иногда забывают о том, что вызов метода может порождать исключение. Проще всего это исправить, помещая вызов метода в блок try-catch.
 
Ошибочный пример:
public void waitFor(int sec) {
 
    Thread.sleep(sec * 1000);
 
}
 
 
Исправленный пример:
public void waitFor(int sec) throws InterruptedException {
 
    Thread.sleep(sec * 1000);
 
}
 
 
 
8. Метод доступа имеет тип void
 
Это очень простая ошибка. Студент создает метод для доступа к переменной, но указывает, что метод ничего не возвращает (помещает модификатор void в загогловок метода). Чтобы исправить эту ошибку, нужно указать правильный тип возвращаемого значения.
 
Ошибочный пример:
public class Line {
 
    private Point start, end;
 
    public void getStart() {
 
      return start;
 
    }
 
}
 
 
Исправленный пример:
public class Line {
 
    private Point start, end;
 
    public Point getStart() {
 
      return start;
 
    }
 
}
 
 
Указание неправильного возвращаемого типа порождает целый класс ошибок. Обычно компилятор распознает эти ошибки и сообщает о них, так что студенты могут самостоятельно их исправить.
 
 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:


Автотранслитерация: выключена

Защитный код

Powered by jComments