2014-07-14 10 views
65

Sto provando Android Studio. Dopo aver creato un nuovo progetto e aggiunto un metodo predefinito onSaveInstanceState alla classe MyActivity, quando provo a eseguire il commit del codice su Git, ottengo uno strano errore che non capisco. Il codice è questo:Significato di errore Android Studio: parametro non annotato sovrascrive parametro @NonNull

L'errore che ottengo è questo:

enter image description here

Se provo a cambiare la firma del metodo per protected void onSaveInstanceState(@NotNull Bundle outState), quindi l'IDE mi dice che non può risolvere il simbolo NotNull.

Cosa devo fare per eliminare l'avviso?

+0

Importa '@ NotNull'? – chrylis

risposta

85

Si tratta di un'annotazione, ma il nome corretto è NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState) 

(e anche)

import android.support.annotation.NonNull; 

Lo scopo è quello di permettere la compilatore per mettere in guardia quando alcune ipotesi vengono violati (come un parametro di un metodo che dovrebbe sempre avere un valore, come in questo caso particolare, anche se ce ne sono altri). Dalla documentazione Support Annotations:

The @NonNull annotation can be used to indicate that a given parameter can not be null.

If a local variable is known to be null (for example because some earlier code checked whether it was null), and you pass that as a parameter to a method where that parameter is marked as @NonNull, the IDE will warn you that you have a potential crash.

Si tratta di strumenti per l'analisi statica. Il comportamento di runtime non è affatto alterato.


In questo caso, l'avviso particolare è che il metodo originale che stai sovrascrivendo (in Activity) ha un @NonNull un'annotazione sul parametro outState, ma non hai includerlo nel metodo prevalente. Solo l'aggiunta che dovrebbe risolvere il problema, vale a dire

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
+4

Qual è lo scopo di questo? –

+1

@IgorGanapolsky Scusa, non l'ho menzionato perché ho pensato che la domanda riguardasse solo la differenza 'NotNull' /' NonNull'. Risposta corretta di conseguenza. – matiash

+2

In altre parole, IMHO, questa annotazione può rimuovere il necessario controllo null all'interno di una funzione e avere un codice più veloce. –

11

Un certo numero di utile support annotations sono stati recentemente aggiunto nella libreria di supporto Android. Il loro ruolo principale è quello di annotare le proprietà di vari metodi e parametri per aiutare a catturare i bug. Ad esempio, se si passa il valore null a un parametro contrassegnato con l'annotazione NotNull, verrà visualizzato un avviso.

Le annotazioni possono essere aggiunti al progetto con Gradle aggiungendo la seguente dipendenza:

dependencies { 
    compile 'com.android.support:support-annotations:20.0.0' 
} 

Hai trovato l'avviso perché il parametro Bundle è contrassegnato con il @NotNull annotazione e l'override del metodo l'annotazione ottiene nascosto. La cosa giusta da fare è aggiungere anche l'annotazione al parametro del metodo sovrascritto.

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
6

In aggiunta alle altre risposte, il @NonNull (ed è avversario, @Nullable) annotazione annota un tipo di campo, parametro o metodo di ritorno. IntelliJ e quindi Android Studio possono avvisarti di possibili NullPointerException s in fase di compilazione.

Un esempio è meglio qui:

@NonNull private String myString = "Hello"; 

@Nullable private String myOtherString = null; 

@NonNull 
public Object doStuff() { 
    System.out.println(myString.length); // No warning 
    System.out.println(doSomething(myString).length); // Warning, the result might be null. 

    doSomething(myOtherString); // Warning, myOtherString might be null. 

    return myOtherString; // Warning, myOtherString might be null. 
} 

@Nullable 
private String doSomething(@NonNull String a) { 
    return a.length > 1 ? null : a; // No warning 
} 

Queste annotazioni non alterare il comportamento runtime (anche se ho experimented con questo), ma servono come strumento per prevenire i bug.

Si noti che il messaggio che hai ricevuto non era un errore, ma solo un avvertimento, che è sicuro di ignorare, se si sceglie di. L'alternativa è di annotare il parametro tu stesso, come suggerisce Android Studio:

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
Problemi correlati