2013-05-21 1 views
2

У меня есть некоторый код, который похож на следующий фрагмент кода:Получил ошибку Findbugs «NP_NULL_ON_SOME_PATH», когда нулевой тест находится в отдельном методе. Это ложная тревога?

public void foo(Order o) { 
    ... 
    checkInput(o, "some error message"); 
    doSomehing(o.getId()); 
} 

private void checkInput(Object o, String message) { 
    if (o == null) { 
     throw new SomeRuntimeException(message); 
    } 
} 

И я получил FindBugs сообщение о проблеме «NP_NULL_ON_SOME_PATH».

Вот описание:

There is a branch of statement that, if executed, guarantees that a null value will be dereferenced, which would generate a NullPointerException when the code is executed. Of course, the problem might be that the branch or statement is infeasible and that the null pointer exception can't ever be executed; deciding that is beyond the ability of FindBugs.

Мои вопросы:

  1. Могу ли я рассматривать его как ложный положительный результат в этом примере?
  2. Является ли хорошей практикой поместить нулевой тест в отдельный метод? Фактический метод проверки нуля немного длиннее, чем метод образца, поэтому я не хочу повторять код везде.

Спасибо!

+0

Это сообщение об ошибке для строки 'doSomehing (o.getId())'? – Peeyush

+0

@Peeyush Да, findbugs сообщает об ошибке для строки doSomehing (o.getId()). Я редактировал код примера, как в реальном коде, тип Object «o» - это какой-то конкретный класс, а не просто «Object», поэтому ошибка связана не с методом getId(). – imJude

ответ

0

Похоже, что FindBugs не может обнаружить этот случай, по крайней мере, с 2.0.2 в Eclipse. Одним из способов является возвращение значения от checkError и аннотирование метода с помощью @Nonnull.

public void foo(Order o) { 
    ... 
    doSomehing(checkInput(o, "some error message").getId()); 
} 

@Nonnull 
private Order checkInput(Order o, String message) { 
    if (o == null) { 
     throw new SomeRuntimeException(message); 
    } 
    ... 
    return o; 
} 
+0

Нужна ли аннотация «@ Notnull» в вашем решении? В настоящий момент API-интерфейс проверки Java не используется в моем проекте. – imJude

+0

@imJude - Это не проверка '@ NotNull' аннотации, а скорее' @ Nonnull' от JSR-305. Он сообщает FindBugs, что 'checkInput' никогда не вернет« null », и, таким образом, разыменование результата всегда безопасно. См. Http://stackoverflow.com/questions/4963300/which-notnull-java-annotation-should-i-use для некоторого фона. –