Я могу комментировать некоторые из описаний FindBugs, которые вы упомянули, основываясь на моем опыте и тестировании, не обращаясь к исходному коду FindBugs.
UI_INHERITANCE_UNSAFE_GETRESOURCE:
Если вы используете this.getClass().getResource(...)
с относительным URI, этот URI будет
разрешено в отношении класса this
. Когда подкласс находится в
другой пакет, и вы получите ресурс для подкласса, в конечном итоге вы ищете
в другом месте (относительно подкласса). Я знаю примеры, когда класс ищет ресурс, который, как известно, находится в том же пакете, вызывая getResource()
с относительным URI, содержащим только имя файла. Если этот класс, где использовать this.getClass()
вместо ClassName.class
, и фактический экземпляр принадлежит подклассу, ресурс не будет найден.
BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR:
Это говорит о типах чисел в штучной упаковке, таких как Integer
и Float
, как
в отличие от простых числовых типов, таких как int
и float
. За
Примитивы, ваши ожидания верны: В boolean ? int : float
int
приводится к float
. Но для свернутых чисел, что-то
неожиданное случается: в boolean ? Integer : Float
, Integer
распакован и принужден к float
. Я бы ожидал объекты
быть возвращенным без изменений, как в
boolean ? (Number)Integer : Float
.
boolean b = Boolean.TRUE;
final Integer i = 123456789;
final Float f = 1.0f;
final Number x = b ? i : f;
System.out.println("wrapped coerced: " + x); // 1.23456792E8
final Number y = b ? (Number) i : f;
System.out.println("wrapped uncoerced: " + y); // 123456789
GC_UNRELATED_TYPES: FindBugs знает
о некоторых методах сбора, которые могли бы
не быть обобщенным для Java 1.5, как
Collection.contains(Object)
. Вот,
аргумент должен быть типа
Object
, потому что в противном случае существует
Исходный код может сломаться. Но любой объект
не типа коллекции уверен
быть не сдержанным, поэтому просим
сдерживание Integer
в
String
коллекция, вероятно, является
ошибка.
Collection<String> coll = new ArrayList<String>();
System.out.println(coll.contains(42));
HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS:
NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH:
SIO_SUPERFLUOUS_INSTANCEOF:?
NN_NAKED_NOTIFY:?
SP_SPIN_ON_FIELD: Если вы вращаете
поле, которое не volatile
, JIT
можно оптимизировать код (по
перемещая чтение из цикла) как
Пока поток выполняет цикл
дает тот же результат, без
принимая во внимание существование и
действия других тем. Вот почему
есть ключевое слово volatile
. Я не знаю ни одного примера, где это могло бы привести к ошибке.
STCAL_STATIC_CALENDAR_INSTANCE:?
WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL:
В примере FindBugs метод
синхронизируется на getClass()
с
получить доступ к статическому члену своего класса.
Подкласс будет синхронизироваться на
подкласс, и поэтому суперкласс и
подкласс может войти в
синхронный блок в то же время, потому что они синхронизируются на разных мониторах,
приводя к состоянию гонки.
EQ_UNUSUAL:?
SF_SWITCH_FALLTHROUGH: Это помогает мне
иногда, потому что я склонен скучать по
break
. Интересно, что в тесте
дело только что выполнил, попал я к этому
FindBugs сообщение сообщение
SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH.
TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK: