| Работа над ошибками-3 |
|
|
Sunday, 19 March 2006 | А.Грасоffб сайт SQL.Ru для раздела Ученье – свет Мы продолжаем публикацию чрезвычайно, на мой взгляд, полезного материала, описывающего некоторое количество достаточно распространенных ошибок у начинающих программистов при работе в Java. Сегодня – еще три раздела; по правде говоря, с некоторыми сталкивался и я сам...
9. Вызов нестатичных методов класса из метода main()
Входной точкой любой Java программы должен быть статичный метод main:
Так как этот метод статичный, нельзя из него вызывать нестатичные методы класса. Об этом часто забывают студенты и пытаются вызывать методы, не создавая экземпляр класса. Эту ошибку обычно допускают в самом начале обучения, когда студенты пишут маленькие программы. Ошибочный пример:
Есть 2 способа исправления ошибки: сделать нужный метод статичным или создать экземпляр класса. Чтобы правильно выбрать нужный способ, задайте себе вопрос: использует ли метод поля или другие методы класса. Если да, то следует создать экземпляр класса и вызвать у него метод, иначе следует сделать метод статичным. Исправленный пример 1:
Исправленный пример 2:
10. Использование объектов класса String как параметров метода. В Java класс java.lang.String хранит строковые данные. Однако, строки в Java (1) обладают постоянством (то есть их нельзя изменять), (2) являются объектами. Поэтому с ними нельзя обращаться как просто с буфером символов, это неизменяемые объекты. Иногда студенты передают строки, ошибочно расчитывая на то, что строка-объект будет передана как массив символов по ссылке (как в C или C++). Компилятор обычно не считает это ошибкой. Ошибочный пример.
В примере выше студент хочет изменить значение локальной переменной test1, присваивая новое значение параметру line в методе appendTodaysDate. Естественно это не сработает. Значение line изменится, но значение test1 останется прежним. Эта ошибка возникает из-за непонимания того, что (1) java объекты всегда передаются по ссылке и (2) строки в Java неизменяемы. Нужно осмыслить, что объекты-строки никогда не изменяют своего значения, а все операции над строками создают новый объект. Чтобы исправить ошибку в примере выше, нужно или возвращать строку из метода, или передавать объект StringBuffer как параметр методу вместо String. Исправленный пример 1:
Исправленный пример 2:
11. Объявление конструктора как метода Конструкторы объектов в Java внешне похожы на обычные методы. Единственные отличия - у конструктора не указывается тип возвращаемого значения и название совпадает с именем класса. К несчастью, Java допускает задание имени метода, совпадающего с названием класса. В примере ниже, студент хочет проинициализировать поле класса Vector list при создании класса. Этого не произойдет, так как метод 'IntList' - это не конструктор. Ошибочный пример.
Код выдаст исключение NullPointerException при первом же ображении к полю list. Ошибку легко исправить: нужно просто убрать возвращаемое значение из заголовка метода. Исправленный пример:
Продолжение следует
|
||||||||||||