Следующий фрагмент воспроизводит предупреждение в Android Studio.Dereference может генерировать «java.lang.NullPointerException»
Bundle extras = getIntent().getExtras();
if (extras != null && extras.getString(REDIRECT_KEY) != null) {
switch (extras.getString(REDIRECT_KEY)) { ...
extras.getString(REDIRECT_KEY)
производит предупред
разыменование 'extras.getString (REDIRECT_KEY)' может производить 'java.lang.NullPointerException'
Но я не Нет никакого сценария, где это может произойти. Это ошибка в проверках lint, что она просто не распознает мои нулевые проверки в if, если раньше? Или мне что-то не хватает?
EDIT: изменения кода на следующий, сделал удалить предупреждение
if(getIntent() != null && getIntent().getStringExtra(REDIRECT_KEY) != null){
switch (getIntent().getStringExtra(REDIRECT_KEY)){
...
}
}
НО это ушло только потому, кстати, эта проверка ворса работает (по крайней мере, я думаю). Если я покажу более подробную информацию для этой проверки, он говорит в одной точке
Переменных, параметры метода и возвращаемые значения, помеченные как @Nullable или @NotNull рассматриваются как обнуляемые (или не нулевые, соответственно) и используемые в ходе анализ, чтобы проверить допустимость пустых контрактов
Глядя на исходный код Bundle и Намерения показывает:
/**
* Retrieve extended data from the intent.
*
* @param name The name of the desired item.
*
* @return the value of an item that previously added with putExtra()
* or null if no String value was found.
*
* @see #putExtra(String, String)
*/
public String getStringExtra(String name) {
return mExtras == null ? null : mExtras.getString(name);
}
и BaseBundle
/**
* Returns the value associated with the given key, or null if
* no mapping of the desired type exists for the given key or a null
* value is explicitly associated with the key.
*
* @param key a String, or null
* @return a String value, or null
*/
@Nullable
public String getString(@Nullable String key) {
unparcel();
final Object o = mMap.get(key);
try {
return (String) o;
} catch (ClassCastException e) {
typeWarning(key, o, "String", e);
return null;
}
}
Как вы можете видеть, BaseBundle устанавливает свои возвращаемые значения в @Nullable, а Intent - нет. Поэтому использование getStringExtra
устраняет симпозиумы, а не причину. Я догадываюсь, что это вызвано недостаточной проверкой на линт, вместо неправильного кодирования на моей стороне. Или кто-нибудь все еще видит сценарий, где может быть выброшен указатель Null?
В какой строке это предупреждение? второй или третий? – Ferrybig
Я думаю, что вместо того, чтобы получать String каждый раз из дополнительных функций, вы должны назначить его переменной. Потому что ваши дополнительные параметры могут стать нулевыми в определенных ситуациях. – Pragnani
третья строка в фрагменте или строка 80 на изображении. Я проверяю extras == null и результат getString() == null. См. Раздел «Ввод» во второй строке. – AlbAtNf