마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

파이어베이스를 이용해서 동시에 퍼즐을 시작하려고 합니다.

0 추천

 

    public void onButtonButtonMode(View view)
    {
        signIn();
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1){
            assert data != null;
            gameMode = data.getIntExtra("Mode", 0);
            Intent intent;
            switch (gameMode){
                case 1:
                    intent = new Intent(this, QuizMode1.class);
                    break;
                case 3:
                    intent = new Intent(this, RoomWaiting.class);
                    startActivityForResult(intent, 3);
                    return;
                case 2:
                    intent = new Intent(this, QuizMode2.class);
                    break;
                default:
                    Log.e("MainActivity", "게임 모드가 정해지지 않았습니다.");
                    return;
            }
            intent.putExtra("Mode", gameMode);
            intent.putExtra("id", (String)mAuth.getUid());

            startActivity(intent);
        }
        if(requestCode == 3){
            Intent intent = new Intent(this, QuizMode1.class);
            intent.putExtra("Mode", gameMode);
            intent.putExtra("key", data.getStringExtra("key")); //###MainActivity.java:169#####
            intent.putExtra("id", (String)mAuth.getUid());
            startActivity(intent);
        }
        //login
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
            }
        }
    }

파이어베이스를 통해서 두 휴대폰이 퍼즐 게임을 동시에 시작하려고 하는데 원래는 waiting이 true이고 참가자가 들어오면서 false로 바뀌고 방을 만든 유저가 false로 바뀐걸 인식하고 참가하도록 되어있었는데 방을 만든 유저는 먹통이고 참가한 유저만 퀴즈에 입장하는 문제가 생겨서 addValue리스너의 onDataChange로 파이어베이스에 저장된 waiting1과 waiting2가 모두 true가 되면 matchingsuccess가 실행되도록 코드를 짰더니 위의 mainactivity 169줄에

intent.putExtra("key", data.getStringExtra("key")); 

에서 null 오류가 납니다. 어디가 문제일까요??

orionc (200 포인트) 님이 2021년 4월 12일 질문
orionc님이 2021년 4월 12일 수정
2021-04-12 19:55:39.256 17935-17935/com.example.celebrityquiz E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.celebrityquiz, PID: 17935
    java.lang.RuntimeException: Unable to resume activity {com.example.celebrityquiz/com.example.celebrityquiz.MainActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=0, data=null} to activity {com.example.celebrityquiz/com.example.celebrityquiz.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.performResumeActivity(ActivityThread.java:4205)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237)
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=0, data=null} to activity {com.example.celebrityquiz/com.example.celebrityquiz.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:4845)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4192)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     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.celebrityquiz.MainActivity.onActivityResult(MainActivity.java:169)
        at android.app.Activity.dispatchActivityResult(Activity.java:8110)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4838)
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4192) 
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237) 
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

에러 메시지 전체는 이렇습니다.

1개의 답변

0 추천
 
채택된 답변

activityResult 를 보시면

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)

마지막 data 가 @Nullable 입니다. 따라서 data가 null인지 체크하는 코드는 반드시 넣으셔야 하구요. 아마도 setResult하는 쪽에서 data를 님이 필요한 넘기지 않은 걸로 보이네요. 에러메세지 자체가 클리어하지 않을 수 있기 때문에 onActivityResult의 data에 값이 꼭 넘어와야 한다면, 값이 존재하지 않을 경우 아래처럼 exception을 던지세요. 그렇게 하면 왜 exception이 발생했는지 쉽게 알 수 있게 됩니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == 1 && data == null){
         throw new IllegalStateExcetion("setResult에 값을 전달하는 것을 잊어 버리셨네요.")
    }
       
}

 

spark (224,800 포인트) 님이 2021년 4월 12일 답변
orionc님이 2021년 4월 12일 채택됨
감사합니다 확인해보겠습니다!
...