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)
}
}
참고
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
자바로 구현된 코드지만 안드로이드 기본 동작은 동일하지 않을지..?
원래대로 findViewById
를 onCreate
콜백함수 내에 옮겨두었더니 죽지 않고 정상 실행된다.