Poniższy fragment generuje ostrzeżenie o lintach w Android Studio.Dereferencja może spowodować "java.lang.NullPointerException"
Bundle extras = getIntent().getExtras();
if (extras != null && extras.getString(REDIRECT_KEY) != null) {
switch (extras.getString(REDIRECT_KEY)) { ...
extras.getString(REDIRECT_KEY)
produkuje ostrzeżenia
dereference z 'extras.getString (REDIRECT_KEY)' może produkować 'java.lang.NullPointerException'
ale don nie widzisz żadnego scenariusza, w którym mogłoby to się zdarzyć. Czy jest to błąd w sprawdzaniu lint, że po prostu nie rozpoznaje moich zerowych sprawdzeń w poprzednim przypadku? Czy może czegoś nie przeoczyłem?
EDIT: zmiany kodu do następujących, nie usunąć ostrzeżenie
if(getIntent() != null && getIntent().getStringExtra(REDIRECT_KEY) != null){
switch (getIntent().getStringExtra(REDIRECT_KEY)){
...
}
}
ale to już tylko ze względu na sposób to działa check szarpie (przynajmniej sądzę). Jeśli pokazać więcej infos tej kontroli, to mówi się w jednym punkcie
zmienne, parametry metody i zwracania wartości oznaczone jako @Nullable lub @NotNull są traktowane jako pustych (lub nie-zerowy, odpowiednio), który używano w trakcie analiza sprawdzić opcje dopuszczania wartości null umów
Patrząc na kod źródłowy Bundle i intencyjnego pokazuje:
/**
* 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);
}
i 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;
}
}
Jak widać, BaseBundle ustawia wartości zwracane na @Nullable, a Intent nie. Tak więc użycie getStringExtra
usuwa tylko symoptomy, a nie przyczynę. Wciąż przypuszczam, że jest to spowodowane niewystarczającym sprawdzeniem linta, zamiast błędnego kodowania po mojej stronie. A może ktoś nadal widzi scenariusz, w którym można rzucić wskaźnik zerowy?
Jaka linia nadaje ostrzeżenie? druga czy trzecia? – Ferrybig
Myślę, że zamiast otrzymywać String za każdym razem z dodatków, powinieneś przypisać go do zmiennej. Ponieważ Twoje dodatki mogą stać się puste w pewnych sytuacjach. – Pragnani
trzeci wiersz w fragmencie kodu lub linia 80 na obrazie. Sprawdzam dodatki == null i dla wyniku getString() == null. Zobacz If w drugim wierszu. – AlbAtNf