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

[안드로이드스튜디오] 버튼 누르면 앱이 종료됩니다..NPE에러

0 추천

FATAL EXCEPTION: main

Process: com.example.sunity, PID: 5602

 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

at com.example.sunity.Activity.RoomActivity$1.onDataChange(RoomActivity.java:62)

at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)

at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)

at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)

at android.os.Handler.handleCallback(Handler.java:938)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:201)

at android.os.Looper.loop(Looper.java:288)

at android.app.ActivityThread.main(ActivityThread.java:7839)

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:1003)

 

버튼을 누르면 RoomActivity로 넘어가야하는데 버튼 누르면 잠깐 떴다가 다시 초기화면으로 돌아가고

이때 또 버튼을 다시 누르면 앱이 종료됩니다..

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Memberinfo memberinfo = dataSnapshot.getValue(Memberinfo.class);
                username.setText(memberinfo.getUsername());
                if (memberinfo.getImageURL().equals("default")){
                    profile_image.setImageResource(R.mipmap.ic_launcher);
                }else {


                    Glide.with(getApplicationContext()).load(memberinfo.getImageURL()).into(profile_image);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

로그캣에 나온 RoomActivity.java의 62번째 줄은 if문부분입니다..

어떻게 고쳐야할까요ㅠㅠ 살려주세요

gkdisahs (200 포인트) 님이 2022년 11월 26일 질문
gkdisahs님이 2022년 11월 26일 수정

1개의 답변

+1 추천
 
채택된 답변

에레메세지를 잘 보시면 어디가 문제인지 알 수 있습니다.

 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

-> String.equals()를 호출할 때, NPE발생하는데, 원인인 String이  null이기 때문입니다.

at com.example.sunity.Activity.RoomActivity$1.onDataChange(RoomActivity.java:62)

-> Exception이 발생한 라인이  RoomActivity의 62번찌 라인입니다. 아마도 여기에 링크가 걸려있을 겁니다. 클릭하면 바로 소스코드로 이동할 겁니다.

소스코드에서 아래부분이 에러가 나는 코드인 걸로 보입니다.

memberinfo.getImageURL().equals("default")

memberInfo.getImageUrl()가 널이라서 나는 에러이므로, memberInfo에 값이 어떻게 세팅되는지 확인해 보시면 될 것 같습니다.

그리고 위의 getImageURL()이 널인 것과 관계없이 비교를 하시려면, 아래처럼 비교 순서를 바꾸세요.

"default".equals(memberinfo.getImageURL())

 

spark (226,420 포인트) 님이 2022년 11월 27일 답변
gkdisahs님이 2022년 11월 27일 채택됨
아래처럼 수정하고 진행하였는데
java.lang.NullPointerException: You cannot start a load on a not yet attached View or a Fragment where getActivity() returns null (which usually occurs when getActivity() is called before the Fragment is attached or after the Fragment is destroyed).
위와 같은 에러가 뜨면서 또 앱이 종료됩니다..

  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Memberinfo memberinfo = dataSnapshot.getValue(Memberinfo.class);
                username.setText(memberinfo.getUsername());
                if ("default".equals(memberinfo.getImageURL())){
                    image_profile.setImageResource(R.mipmap.ic_launcher);
                } else
                    Glide.with(getContext()).load(memberinfo.getImageURL()).into(image_profile);
            }

이 코드에서 else부분이 잘못됐다는데 glide 맞게 쓴거아닌가요?ㅠ
안드로이드 시스템이 화면에 사용되는 Context를 로딩하기 전에 접근하시면 위와 같은 에러가 나옵니다. Lifecycle이라고 들어보셨을 거예요. Fragment에서 Context나 Activity(같은 인스턴스로 보면 됨) 사용하려면 onCreateView 호출되고  나서 접근하셔야 합니다. 보통은 onCreateView다음에 호출되는 onViewCreated 에서 findViewById와 같은 뷰에 대한 초기설정 작업을 하게 됩니다. 아마도 Firebase에서 데이터를 가져오는 부분을 onViewCreted나 그 이후 호출되는 콜백메소드(onResume, onStart 등)에서 하시는게 맞을 것 같습니다.
프레그먼트의 라이프사이클은 아래 개발자 문서를 참고하세요.
https://developer.android.com/guide/fragments/lifecycle

안드로이드 개발을 하신다면 복잡하긴 하지만 필수적으로 알야야하는 내용이기도 합니다.
정말 감사합니다!!ㅠㅠㅎㅎ
...