Findbugs - close() вызывается для значения, которое всегда равно null

У меня есть этот блок кода

private void doSomething(Properties properties) throws XXException 
{
    PersistenceManager pm = null;        

    try {
        pm = new PersistenceManager(distributedDatabase, "PeriodHelper: insertPeriod");

        try {
            pm.create(Tables.MY_TABLE);
        } catch (ObjectAlreadyExistsException e) {
            logger.warn("Could not create table! - "+e.getMessage(), e);
            return;
        }

        pm.commit();
        return;
    } 
    catch (Exception e) {
        throw new XXException(e.getMessage(), e);
    }
    finally {
        if (pm != null) 
            pm.close();
    }
}

что findbugs/sonar сообщает о поражении

Correctness - close() invoked on a value that is always null
close() is being invoked on a value that is always null. If this statement 
is executed, a null pointer exception will occur. But the big risk here you
never close something that should be closed.
Key:    NP_CLOSING_NULL

но если вы посмотрите на код, объект pm при вызове метода close() всегда будет не нулевым. Кто-нибудь может объяснить, почему findbugs ошибается?


person emeraldjava    schedule 31.08.2011    source источник
comment
Можете ли вы показать код до и внутри предложения finally?   -  person home    schedule 31.08.2011
comment
У вас есть более 30 вопросов без принятого ответа. Возможно, вы могли бы просмотреть старый вопрос, чтобы увидеть приемлемые ответы.   -  person Peter Lawrey    schedule 31.08.2011
comment
Ваша ошибка находится в строке 42 вашего кода. Если это не очевидно, отправьте код, и мы сможем вам его указать.   -  person rossum    schedule 31.08.2011
comment
обновил пример кода, рассмотрел и принял некоторые старые ответы   -  person emeraldjava    schedule 31.08.2011
comment
Есть ли шанс, что этот код будет изменен с помощью аспектов или тому подобного? Мне действительно нужно увидеть байт-код, который был сгенерирован для этого метода, чтобы сказать вам, действительно ли это была проблема или нет... или это просто у Findbugs был плохой день для волос.   -  person MeBigFatGuy    schedule 18.09.2011


Ответы (2)


Либо Findbugs просто ошибается (это будет не в первый раз), или он знает, что pm не может быть здесь ненулевым (в этом случае он как бы сообщить о неправильной ошибке, он должен сказать "мертвый код" или "условие всегда ложно").

person Joachim Sauer    schedule 31.08.2011

Вы пытаетесь заключить оператор if в фигурные скобки?

if (pm!=null) {pm.close()};
person Adrien Clerc    schedule 31.08.2011
comment
Я говорил это не просто для того, чтобы что-то сказать. Иногда Netbeans жалуется на что-то, пока я не добавляю фигурную скобку. И я не говорю о том, что оператор If должен использовать советы по фигурным скобкам… - person Adrien Clerc; 03.09.2011