Kangho_Story

[안드로이드 코틀린 Kotlin] java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 에러 해결 본문

Android

[안드로이드 코틀린 Kotlin] java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 에러 해결

캉호 2024. 5. 16. 02:15
728x90
반응형
    private var MY_SECRET_KEY  = R.string.MY_API
<resources>
    <string name="API_KEY">MY_API_KEY</string>
</resources>

 

keys.xml에 위와 같은 방식으로 API Key를 저장한 후 MY_SECRET_KEY에서 불러와서 사용함으로써 API 노출을 방지하려고 했다.

 

그런데  java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference이라는 에러를 만났다.

R.string.MY_API로 값을 불러오는 것은 해당 string에 부여된 id를 불러오는 것이므로 int 값을 가진다는 것을 알게 되었다.

 

    private var MY_SECRET_KEY  = resources.getString(R.string.MY_API)

 

그래서 위의 코드로 수정했더니 API 값은 string 타입으로 잘 가져오는 것을 확인했지만 여전히 동일한 오류가 발생했다.

 

혹시 타입을 지정해주지 않아서 발생한 문제인가 생각해서 아래 코드로 변경했지만 동일한 오류가 발생했다.

 

    private var MY_SECRET_KEY : String  = resources.getString(R.string.MY_API)

 

문제점은 사실 타입이 아니었다.

 

 MY_SECRET_KEY가 onCreate이전에 선언됨과 동시에 초기화가 되는 것이 문제였다.

 

그래서  MY_SECRET_KEY는 선언만 해놓고 onCreate 내부에서 key 값을 넣어 주는 코드로 변경했다.

    private lateinit var MY_SECRET_KEY : String
    
    onCreate{//간략하게 예시로 만든 코드
    
        MY_SECRET_KEY = resources.getString(R.string.OpenAI_API)
    
    }

 

그 결과 성공적으로 에러를 해결했다.

 

항상 onCreate 이전에는 선언만 하고 값은 그 이후에 넣도록 하자!

 

끝!

728x90
반응형
Comments