Android 스튜디오 오류의 의미 : 주석이없는 매개 변수가 @NonNull 매개 변수를 재정의합니다.


104

Android Studio를 사용해보고 있습니다. 새 프로젝트 onSaveInstanceState를 만들고 create MyActivity 클래스에 기본 메서드를 추가 할 때 코드를 Git에 커밋하려고하면 이해할 수없는 이상한 오류가 발생합니다. 코드는 다음과 같습니다.

내가 얻는 오류는 다음과 같습니다.

여기에 이미지 설명 입력

메서드 서명을로 변경하려고 protected void onSaveInstanceState(@NotNull Bundle outState)하면 IDE에서 기호를 확인할 수 없다는 메시지가 표시 NotNull됩니다.

경고를 없애려면 어떻게해야합니까?

답변:


124

주석이지만 올바른 이름은 NonNull다음과 같습니다.

protected void onSaveInstanceState(@NonNull Bundle outState)

(그리고 또한)

import android.support.annotation.NonNull;

목적은 특정 가정이 위반 될 때 컴파일러 가 경고 할 수 있도록하는 것입니다 (예 : 다른 가정이 있지만이 특정 경우와 같이 항상 값을 가져야하는 메서드의 매개 변수). 로부터 지원 주석 문서 :

@NonNull주석은 주어진 매개 변수가 null이 될 수없는 것을 나타 내기 위해서 사용할 수 있습니다.

지역 변수가 null로 알려진 경우 (예 : 일부 이전 코드에서 null인지 여부를 확인했기 때문에) 해당 매개 변수가 @NonNull로 표시된 메서드에 매개 변수로 전달하면 IDE에서 다음이 있음을 경고합니다. 잠재적 인 충돌.

정적 분석을위한 도구입니다. 런타임 동작은 전혀 변경되지 않습니다.


이 경우 특정 경고는 재정의중인 원래 메서드 (에서 Activity) @NonNulloutState매개 변수 에 대한 주석이 있지만 재정의 메서드에 포함하지 않았다는 것입니다. 추가하기 만하면 문제가 해결됩니다.

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

5
그 목적은 무엇입니까?
IgorGanapolsky 2014 년

2
@IgorGanapolsky 죄송합니다. 질문이 NotNull/ NonNull차이 에 관한 것이라고 생각했기 때문에 언급하지 않았습니다 . 그에 따라 답변을 조정했습니다.
matiash

2
즉, IMHO,이 주석은 함수 내에서 필요한 null 검사를 제거하고 더 빠른 코드를 가질 수 있습니다.
John Pang

1
@JohnPang 당신 은 할 수 있지만 주석이 암시하는 제한이 실제로 적용된다는 보장이 없기 때문에 좋은 생각이 아닐 수 있습니다.
matiash 2015 년

import android.support.annotation.NonNull; 2 시간 동안이 일을 찾고 ...없는 사람은 따라서 upvote에 널 (null)이 아닌 .. 가져 오는 방법에 대해 언급
Shirish Herwade

15

최근 Android 지원 라이브러리에 여러 유용한 지원 주석 이 추가되었습니다. 주요 역할은 버그를 잡는 데 도움이되도록 다양한 메서드 및 매개 변수의 속성에 주석을 추가하는 것입니다. 예를 들어, 주석으로 null표시된 매개 변수에 값을 전달 NotNull하면 경고가 표시됩니다.

다음 종속성을 추가하여 Gradle로 프로젝트에 주석을 추가 할 수 있습니다.

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

Bundle매개 변수가 @NotNull주석으로 표시되고 메소드를 재정의하면 주석이 숨겨 지기 때문에 경고 가 표시됩니다 . 올바른 방법은 재정의 된 메서드의 매개 변수에도 주석을 추가하는 것입니다.

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

9

다른 답변 외에도 @NonNull(그리고 상대의 @Nullable) 주석은 필드, 매개 변수 또는 메서드 반환 유형에 주석을 답니다. IntelliJ 및 Android Studio는 NullPointerException컴파일 타임 에 가능한 s에 대해 경고 할 수 있습니다 .

여기에 가장 좋은 예가 있습니다.

@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
}

이러한 주석은 런타임 동작을 변경하지는 않지만 (이를 실험 해 보았지만) 버그를 방지하는 도구 역할을합니다.

수신 한 메시지는 오류가 아니라 선택한 경우 무시해도되는 경고 일뿐입니다. 대안은 Android Studio에서 제안하는대로 매개 변수에 직접 주석을 추가하는 것입니다.

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.