loading

프로그래밍/안드로이드

[Android Studio] RuntimeException: Failure delivering result ResultInfo 에러 해결

침착곰 2021. 5. 8. 15:28
반응형

안녕하세요

안드로이드 개발 중 액티비티간 이동을 구현하는 중에 제목과 같은 에러가 발생했습니다

위의 에러의 원인과 해결방법에 대해서 알아보겠습니다

이 해결방법은 제가 해결했던 방법이라 정답이 아닐 수 있습니다

만약 제가 해결한 방법으로 안 되신다면 애도... ㅠ_ㅠ

 


전체 에러 코드

전체 에러 코드입니다

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
            {

        }
    }
}

 

이상 위와 같은 에러가 났을 경우 제가 해결한 방법이었습니다

안드로이드 개발자 분들이 제 글을 보시고 에러를 해결하는데 도움이 되었으면 좋겠습니다!!

반응형
그리드형