안녕하세요
안드로이드 개발 중 액티비티간 이동을 구현하는 중에 제목과 같은 에러가 발생했습니다
위의 에러의 원인과 해결방법에 대해서 알아보겠습니다
이 해결방법은 제가 해결했던 방법이라 정답이 아닐 수 있습니다
만약 제가 해결한 방법으로 안 되신다면 애도... ㅠ_ㅠ
전체 에러 코드
전체 에러 코드입니다
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.startactivity, PID: 10153
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1000, result=0, data=null} to activity {com.example.startactivity/com.example.startactivity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4089)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)
at android.app.ActivityThread.-wrap20(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
at com.example.startactivity.MainActivity.onActivityResult(MainActivity.java:55)
at android.app.Activity.dispatchActivityResult(Activity.java:6932)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)?
at android.app.ActivityThread.-wrap20(ActivityThread.java)?
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)?
at android.os.Handler.dispatchMessage(Handler.java:102)?
at android.os.Looper.loop(Looper.java:154)?
at android.app.ActivityThread.main(ActivityThread.java:6119)?
at java.lang.reflect.Method.invoke(Native Method)?
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)?
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)?
아래는 에러코드 캡쳐본입니다
안드로이드로 작업 중 위와 같은 에러가 발생했습니다
후... 그렇게 찾기 힘든 에러는 아니었지만 언제나 그렇지만 에러가 뜨면 당황스럽습니다
에러 원인
에러의 원인은 액티비티간에 startActivityForResult -> onActivityResult간에 데이터를 주고 받을 때 생긴문제였습니다
MainActivity.java
아래처럼 onClick시 startActivityForResult로 넘겨주는데 onActivityResult의 data.getStringExtra에서 데이터를 null로 받아서 생긴 문제였습니다
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStartActivity:
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
break;
case R.id.btnStartActivityResult:
Intent intent2 = new Intent(this, SecondActivity.class);
startActivityForResult(intent2, 1000);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1000) {
if(resultCode == RESULT_OK) {
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_OK : " + resultMsg, Toast.LENGTH_SHORT).show();
}
else if(resultCode == RESULT_CANCELED)
{
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_CANCELED : " + resultMsg, Toast.LENGTH_SHORT).show();
}
}
}
SecondActivity.java
SecondActivity에서 startActivityForResult로 호출받았는데 putExtra로 데이터를 돌려주지 않아서 null에러가 뜬 것 이었습니다
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnBack:
finish();
break;
}
}
해결 방법
onActivityResult에서 결과를 받을 때 resultCode를 9999999코드를 넣어서 else로 받도록 넣어줬습니다
아래와 같이 setResult에서 9999999로 대략 입력해서 resultCode를 넘겨줍니다
SecondActivity.java
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnBack:
Intent intent3 = new Intent();
setResult(9999999, intent3);
finish();
break;
}
}
메인액티비티에서는 else로 받아 아무것도 처리하지 않고 종료해줍니다
MainActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 1000) {
if(resultCode == RESULT_OK) {
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_OK : " + resultMsg, Toast.LENGTH_SHORT).show();
}
else if(resultCode == RESULT_CANCELED)
{
String resultMsg = data.getStringExtra("ResultMsg");
Toast.makeText(this, "RESULT_CANCELED : " + resultMsg, Toast.LENGTH_SHORT).show();
}
else
{
}
}
}
이상 위와 같은 에러가 났을 경우 제가 해결한 방법이었습니다
안드로이드 개발자 분들이 제 글을 보시고 에러를 해결하는데 도움이 되었으면 좋겠습니다!!
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[Android Studio] 디버깅 방법에 대해서 알아보자! (0) | 2021.05.10 |
---|---|
[Android Studio] startActivity()와 startActivityForResult() 의 차이점 (0) | 2021.05.08 |
[Android Studio] android.content.ActivityNotFoundException: Unable to find explicit activity class 에러해결방법 (2) | 2021.05.07 |
[Android Studio] 내부저장소/외부저장소 절대경로 가져오기 (1) | 2021.05.06 |
[Android Studio] 권한(Permission) 얻기 (4) | 2021.05.06 |