코틀린 인텐트, 형변환 질문입니다.

조회수 690회

e: C:\Users\yhw\AndroidStudioProjects\MyApplication3\app\src\main\java\com\example\myapplication\ResultActivity.kt: (13, 61): Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?

위는 에러 메시지이고요. 13번 줄은 아래 코드 소스 두 줄 입니다.

    val submitText = intent.getStringExtra("submitText").toInt()
    val callText = intent.getStringExtra("callText").toInt()

toInt() 앞에 도트 .(점) 하나가 있는데, 이 점에 빨간색 밑줄이 그어지면서

컴파일이라든지 빌드가 되질 않습니다. 결국엔 어플 자체가 실행이 안되더라구요.

다른 분들이랑 똑같이 프로그래밍 했는데 왜 저만 이런 메시지가 뜨는지 잘 모르겠더군요.

프로그래밍 환경 문제인지...

뷰의 아이디나 임포트나 그런 문제는 아닌것 같습니다.

이유를 아시는 분은 좀 알려주세요.

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • intent가 nullable이여서 그렇습니다.

    intent?.getStringExtra("submitText")?.toInt()
    

    앞에 ?을 붙여서 nullable 접근을 하시거나

    intent!!.getStringExtra("callText")!!.toInt()
    

    앞에 !!을 붙여서 강제로 non-null 처리를 하시면 됩니다.

  • Intent 클래스의 getStringExtra() 메서드는 주어진 이름에 해당하는 값이 없을 경우 null을 반환하다고 나와있습니다. https://developer.android.com/reference/android/content/Intent#getStringExtra(java.lang.String)

    따라서 intent.getStringExtra()를 호출할 때, submitText 혹은 callText라는 이름에 해당하는 값이 있다는 보장이 없어 null을 반환할 수도 있기 때문에 null 안전 호출(?.) 혹은 null이 아니라고 명시하는 호출(!!.)를 사용하라고 하는 것입니다.

    null 안전 호출(?.)의 경우 앞의 값이 null일 경우 뒤의 내용을 실행하지 않게 됩니다.

    intent.getStringExtra("submitText")?.toInt()
    
    /* intent.getStringExtra("submitText")가 null이라면
    toInt()는 실행되지 않고 스킵됩니다. */
    

    null이 아니라고 명시하는 호출(!!.)은 앞의 값이 null이든 아니든 실행하게 됩니다. 그대신 null이었을 경우 NullPointerException 예외가 발생하게 됩니다.

    intent.getStringExtra("callText")!!.toInt()
    
    /* intent.getStringExtra("callText")가 null이면
    그 다음 호출인 toInt()가 실행될 때
    NullPointerException 예외가 발생하고
    앱이 강제 종료됩니다. */
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 와~ 진짜 자세하게 설명해주셔서 감사합니다. 공부하는데 많이 도움 됐습니다. ^^ 이건 완전 교과서네요. 너무 감사드려요. 알 수 없는 사용자 2020.9.1 09:34

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)