Java: нормально ли устанавливать Integer = null? - PullRequest
10 голосов
/ 24 января 2010

У меня есть функция, которая возвращает номер идентификатора, если аргумент существует в базе данных. Если нет, возвращается ноль. Это просьба об исключении нулевого указателя? Отрицательные идентификаторы недопустимы, но я подумал, что было бы понятнее иметь несуществующие аргументы, возвращающие ноль вместо кода ошибки, например -1. Что ты думаешь?

private Integer tidOfTerm(String name) throws SQLException {
    String sql = "SELECT tid FROM term_data WHERE name = ?";
    PreparedStatement prep = conn.prepareStatement(sql);
    prep.setString(1, name);
    ResultSet result = prep.getResultSet();

    if (result.next()) {
        return result.getInt("tid");
    }

    return null; // TODO: is this begging for a null pointer exception?
}

Ответы [ 14 ]

0 голосов
/ 24 января 2010

Это может вызвать большие проблемы у начинающих пользователей. Хорошие кодеры признают, что если имя неверно, то может быть возвращено null. Сказав, что более стандартная вещь - бросить немного exception.

0 голосов
/ 24 января 2010

Да, это должно вызывать NPE, и Да, вы должны ловить это в методе вызова (или в другом подходящем месте). Наиболее вероятная причина, по которой ваш метод будет возвращать NULL, - это отсутствие записей и правильный способ обработки - генерирование исключения. И идеальное исключение, чтобы сказать кому-то, что у вас нет того, о чем он просил, - это NPE.

Возвращение кода ошибки (например, -1) не годится, потому что:

a) если есть много ошибок, которые вы хотите обработать (например, не можете прочитать DB, можете прочитать DB, но объект не существует в DB, ​​найден объект, но что-то повреждено и т. Д.), То возврат кода ошибки не различает типы ошибок.

b) в будущем, если -1 станет допустимым идентификатором термина, его будет трудно изменить (если вы должны использовать -1, тогда (РЕДАКТИРОВАТЬ: в С) по крайней мере выполните #define ERRORCODE -1 и используйте ОШИБКА везде)

0 голосов
/ 24 января 2010

Я согласен с постерами. Целое число - это оболочка, поэтому оно должно использоваться для вычислений, конверсий и т. Д. (Что, я думаю, вы собираетесь делать). Не возвращайте ноль, используйте отрицательное число ... это немного более элегантно и дает вам больше контроля. ИМХО.

0 голосов
/ 24 января 2010

Нет, не будет. Он будет выбрасывать NPE только в том случае, если впоследствии вы будете выполнять над ним операции, как если бы он был примитивом без проверки на нуль. Например. i++ и так далее. Ваш пример верен (ожидайте, что сам код JDBC пропускает ресурсы). Если вам не нужен фактический id, то вы также можете просто вернуть boolean.

...