Трабл с полями и переменными

Время от времени Java-программисты «наступают на грабли», обозначая одинаковыми словами поля класса и переменные внутри метода. Отладка при такой ошибке может очень сильно затянуться, поэтому хочу посвятить данной проблеме несколько строк.

Допустим, написан следующий код:

public static void startServer(){
   . . . 
   Backend backend = DirectoryServer.getBackend("userRoot");
   backend.addEntry(reader.readEntry(), null);
 }


В данном случае совершенно не важно, что такое Backend, DirectoryServer и т.п. Важно то, что внутри метода startServer() используется переменная backend типа Backend.

Развивая программу, программист решает, что этот backend пригодится ему и в других методах и превращает переменную в поле класса. Да и алгоритм он решает разнести на два метода.


 private static Backend backend;	

 public static void startServer(){
   . . . 
   Backend backend = DirectoryServer.getBackend("userRoot");
 }

 public static void importEntry(){
   . . .
   backend.addEntry(reader.readEntry(), null);
 }


Откуда здесь возникает проклятый NullPointerException? Дело в том, что backend теперь существует в двух ипостасях. Это и название поля, и название одноименной переменной внутри метода startServer(). Очень часто такая ситуация возникает из нехорошей привычки копипастить код. Правильно будет так:


 private static Backend backend;	

 public static void startServer(){
   . . . 
   backend = DirectoryServer.getBackend("userRoot");
 }

 public static void importEntry(){
   . . .
   backend.addEntry(reader.readEntry(), null);
 }


Вот теперь — никаких синонимов. Поле backend инициализируется в первом методе и может быть успешно использовано во втором.
  • +6
  • 11 июня 2010, 01:16
  • yababay

Комментарии (2)

RSS свернуть / развернуть
+
0
Лучше сделать префиксы какие-нибудь
avatar

Sergei_T

  • 11 июня 2010, 08:41
+
0
А то на самом деле такие ошибки сложно отлаживаемые)
avatar

Sergei_T

  • 11 июня 2010, 08:41

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.