Потому что ты можешь знать из каких-то соображений, что это невозможно, а анализатор знать не будет
Вот пример:
String s = null;
for(String s2 : list) {
if(s2.startsWith("something")) s = s2;
}
return s.trim();
Ругаться на s.trim() или нет?
Возможно, по логике программы известно, что в списке всегда есть строка, которая начинается с something
Установить этот факт статически нереально
Paul Nazarov
@thelamon
ну это возможно в обе стороны, тут ничего не скажешь
достоверно ничего неизвестно
Tagir Valeev
@amaembo
Ну вот и вопрос: показывать тут варнинг, терпя возможные false-positive, или не показывать, терпя возможные false-negative =)
Сейчас ещё пытаюсь побороть такие ситуации типа
boolean invalid = s == null || blahblah || somethingelse;
if(invalid) {
s = "";
}
return s.trim();
Вроде конкретно этот пример даже должен не выдавать сработок ложных
То есть смысл нулл-анализа (если пока не брать в расчёт аннотации) - если мы где-то проверяли переменную на null, либо когда-то присваивали в неё null, то она nullable
И тогда теоретически дереференс без проверки опасен
Но реально есть куча исключений, которые все статически не отследишь
Ivan Sopov
@isopov
null-анализ без аннотаций нормально, если будет в очень ограниченном виде. Кому хочется полноценного - пусть размечает все филды и параметры аннотациями - у нас всё размечено.
причем, у нас null-анализ немножко допиленный и для наших допилов аннотации сделаны RetentionPolicy.RUNTIME
у обычных джетбрейнсовских RetentionPolicy.CLASS, так что тоже можно использовать, насколько я понимаю
Tagir Valeev
@amaembo
Можно, да. Аннотации я, конечно, со временем поддержу