2017-01-31 5 views
0

onCreateView() 메서드에 다음 코드 줄이 있습니다. Fragment입니다. createPinPresenter.setLoginResult()의 표현은 null 일 수 있다고 경고합니다.안드로이드 스튜디오는 체크 후에도 null이되는 식을 불평합니다

expression might be null warning

그래서 나는 null 체크를 생성하는 요청과이 작업을 수행합니다. 자동 코드 생성 된 후에도

expression might be null even after surrounding with if

는 AS 여전히 null 인 같은 표현을 뿌려줍니다. 수표 안에 분명히 null 수 없습니다.

여기에 명백한 내용이 누락되었거나 버그입니까?

편집 : 버전 2.2.3

+0

버그가 아니며 위의 코드를 읽고 null 확인을 볼 정도로 똑똑하지 않은 것일 수 있습니다. 함수가 널 (null)을 반환 할 수 있는지 알아보기는 쉽지 않습니다. 코드를 구문 분석하기가 어렵고 실제로 검사되었는지 확인하십시오. –

+0

@ GabeSechan하지만 일단 적절한 검사가 끝나면 AS 웨이브가 경고 메시지 (null이 아닐 수도 있음)를 보았습니다. 이것에 대해서도 똑같이해야하지 않습니까? 예를 들어,'assert expression! = null'을'if (BuildConfig.DEBUG && expression) {throw new AssertionError();}' –

+0

으로 변환하라는 요청은 당신이 기대하는 것보다 쉽습니다. 전체 함수를 구문 분석하고 컨텍스트를 분석하기를 찾지 않으면 assert (blah)를 호출하면 if (BuildConfig.DEBUG) blah로 변환하면 간단한 한 줄 규칙을 볼 수 있습니다. 당신이 원하는 것은 버그보다 더 많은 기능 요청입니다. –

답변

0

이 올바른지 그대로 사용하고, 예를 들어, getParcelable()는 같은 값을 반환합니다 경우 어떻게 AS 알고 있나요? 의미 제어가 아니라 구문 제어입니다. 호출 된 횟수가 홀수 인 경우 함수에서 예를 들어 null을 반환 할 수 있습니다.이 경우 경고가 올바른 것입니다. 오류가 매우 명백이며, 제어 코드에 방지하기 위해 무엇을하려고 사실이다 :

if (getNextValue() != null) 
    value = getNextValue(); 

getNextValue() 인덱스를 증가하는 경우, 배열의 마지막에이 null을 반환 할 수 :

이가 생각.

유일한 해결책은 임시 변수에 getParcelable(KEY_LOGIN_RESULT)의 결과를 저장하는 것입니다.이 경우 AS가이를 올바르게 관리합니다.

물론 ...이 코드가 자동 생성 코드라는 사실은 자동 생성의 버그입니다. 이는 컨트롤보다 덜 똑똑합니다.

+0

예 자동 생성이 버그라는 데 동의합니다. https://code.google.com/p/android/issues/detail?id=233192에서 문제를 열었습니다. 개발자의 의견을 보도록하겠습니다. –

+0

나는 아무것도 믿지 않는다. 로컬 변수를 만드는 것이 AS의 것은 아니며, 코드에서 발생할 수있는 오류의 추가 소스가 될 수 있습니다. –

+0

AS는 '변수 추출'리팩토링을 수행 할 때 변수를 만듭니다. 또한 이러한 변수는 범위가 고유합니다. –