Трабл с полями и переменными
Время от времени Java-программисты «наступают на грабли», обозначая одинаковыми словами поля класса и переменные внутри метода. Отладка при такой ошибке может очень сильно затянуться, поэтому хочу посвятить данной проблеме несколько строк.
Допустим, написан следующий код:
В данном случае совершенно не важно, что такое Backend, DirectoryServer и т.п. Важно то, что внутри метода startServer() используется переменная backend типа Backend.
Развивая программу, программист решает, что этот backend пригодится ему и в других методах и превращает переменную в поле класса. Да и алгоритм он решает разнести на два метода.
Откуда здесь возникает проклятый NullPointerException? Дело в том, что backend теперь существует в двух ипостасях. Это и название поля, и название одноименной переменной внутри метода startServer(). Очень часто такая ситуация возникает из нехорошей привычки копипастить код. Правильно будет так:
Вот теперь — никаких синонимов. Поле backend инициализируется в первом методе и может быть успешно использовано во втором.
Допустим, написан следующий код:
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 инициализируется в первом методе и может быть успешно использовано во втором.
Комментарии (2)
RSS свернуть / развернутьSergei_T
Sergei_T
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.