IT/Android

[Android] NPE Error | Unable to instantiate activity ComponentInfo | java.lang.NullPointerException

ttoogi 2023. 2. 21. 12:25

LoginActivity 에서 버튼 클릭 시 MainActivity로 화면 전환이 되는데, 이 때 앱이 죽음.

W/LoginActivity: ID: Unknown, PWD: 
E/LoginActivity: onPause Called
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mystrava, PID: 29176
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.mystrava/com.example.mystrava.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3551)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7872)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference
        at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:202)
        at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:174)
        at android.content.Context.obtainStyledAttributes(Context.java:861)
        at androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor(AppCompatDelegateImpl.java:922)
        at androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor(AppCompatDelegateImpl.java:889)
        at androidx.appcompat.app.AppCompatDelegateImpl.findViewById(AppCompatDelegateImpl.java:691)
        at androidx.appcompat.app.AppCompatActivity.findViewById(AppCompatActivity.java:264)
        at com.example.mystrava.MainActivity.<init>(MainActivity.kt:11)
        at java.lang.Class.newInstance(Native Method)
        at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
        at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1339)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3538)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7872) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 
I/Process: Sending signal. PID: 29176 SIG: 9

원래 화면이 잘 넘어갔는데, 아래처럼 소스 수정 후 앱이 비정상 종료되며 죽음.

Before

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.e("MainActivity", "onCreate Called")
        Toast.makeText(this@MainActivity, "welcome, " + loginUser.id, Toast.LENGTH_SHORT).show()

        val btnStart = findViewById<Button>(R.id.btnStart)
        var recordIntent : Intent = Intent(this, RecordActivity::class.java)
        val btnMyPage = findViewById<Button>(R.id.btnInfo)
        var myInfoIntent : Intent = Intent(this, UserActivity::class.java)

        btnStart.setOnClickListener {
            Log.i("MainActivity", "btnStart Clicked! startActivity (RecordActivity)")
            startActivity(recordIntent)
        }

        btnMyPage.setOnClickListener {
            Log.i("MainActivity", "btnMyPage Clicked! startActivity (UserActivity)")
            startActivity(myInfoIntent)
        }
    }

After

class MainActivity : AppCompatActivity() {
    val btnStart = findViewById<Button>(R.id.btnStart)
    var recordIntent : Intent = Intent(this, RecordActivity::class.java)
    val btnMyPage = findViewById<Button>(R.id.btnInfo)
    var myInfoIntent : Intent = Intent(this, UserActivity::class.java)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.e("MainActivity", "onCreate Called")
        Toast.makeText(this@MainActivity, "welcome, " + loginUser.id, Toast.LENGTH_SHORT).show()



        btnStart.setOnClickListener {
            Log.i("MainActivity", "btnStart Clicked! startActivity (RecordActivity)")
            startActivity(recordIntent)
        }

        btnMyPage.setOnClickListener {
            Log.i("MainActivity", "btnMyPage Clicked! startActivity (UserActivity)")
            startActivity(myInfoIntent)
        }
    }

참고

https://stackoverflow.com/questions/72233368/npe-attempt-to-invoke-virtual-method-android-content-pm-applicationinfo-androi

You cannot do this:private TextView display_textview = findViewById(R.id.display_textview) - findViewById can only be called in the onCreate (or later) (because the activity context has not been set yet) and after the layout has been set (otherwise it would not find the elements).
Just move the initialization to right after setContentView(R.layout.activity_main) for example in MainActivity. –
5f3bde39-70a2-4df1-afa2-47f61b

자바로 구현된 코드지만 안드로이드 기본 동작은 동일하지 않을지..?

원래대로 findViewByIdonCreate 콜백함수 내에 옮겨두었더니 죽지 않고 정상 실행된다.