onCreate 외 다른 함수 실행 시 클래스 안의 변수를 참조할 때 자꾸 null인 object를 참조했다고 오류가 납니다...

조회수 517회

전체 소스코드를 첨부하기엔 너무 길어서 필요 없는 부분은 잘랐습니다.

에러 발생 경로를 설명드리자면,

우선 onCreate 함수 맨 마지막 줄 보면 아시겠지만 showWords 함수를 콜하고 있습니다. 여기에서는 코드가 문제없이 동작합니다.

그런데,

다른 클래스에서 bookmarkWord 함수를 콜한 후 해당 함수에서 다시 showWords 함수를 콜하는 순간, 오류가 발생합니다.

오류 내용은 아래에 첨부드리겠습니다. 정말 간절하게 도움 요청 드립니다...

public class MainActivity extends AppCompatActivity {

    final String TAG = "MainActivity";

    LinearLayout background;
    RecyclerView wordList;
    ImageButton addWords, settings;
    CheckBox showBookmarks;

    FirebaseAuth auth;
    FirebaseUser currentUser;
    String currentUserUid;

    CollectionReference reference;

    boolean isBookmarkCheckboxChecked = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        background = findViewById(R.id.layout_background);
        wordList = findViewById(R.id.word_list);
        addWords = findViewById(R.id.btn_add_word);
        showBookmarks = findViewById(R.id.checkbox_show_bookmarks);
        settings = findViewById(R.id.btn_settings);

        auth = FirebaseAuth.getInstance();
        currentUser = auth.getCurrentUser();
        currentUserUid = currentUser.getUid();

        getWindow().setStatusBarColor(getApplicationContext().getColor(R.color.colorBackground));

        checkForUpdates();

        showBookmarks.setChecked(isBookmarkCheckboxChecked);

        // Word list
        wordList.setLayoutManager(new LinearLayoutManager(this));
        wordList.setHasFixedSize(true);
        showWords(showBookmarks.isChecked());
    }

    private void showWords(boolean isChecked) {
        reference = FirebaseFirestore.getInstance().collection("words");
        final List<WordData> wordDataList = new ArrayList<>();

        Query bookmarkQuery = reference;
        if (isChecked) {  // Set bookmarkQuery
            bookmarkQuery = reference.whereEqualTo("isBookmarked", true);
        }

        Log.d(TAG, "showWords: isChecked=" + isChecked);

        bookmarkQuery
                // Get words from documents where uid is same with user's one
                .whereEqualTo("uid", currentUserUid)
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot snapshot,
                                        @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            Log.w(TAG, "Failed to get words", e);
                            Snackbar.make(background,
                                    "단어를 불러오지 못했습니다.", Snackbar.LENGTH_LONG);
                        }

                        if (snapshot != null) {
                            for (QueryDocumentSnapshot doc : snapshot) {

                                WordData wordData = new WordData();
                                wordData.word = doc.getString("word");
                                wordData.meaning = doc.getString("meaning");
                                wordData.meanings = (List<String>) doc.get("meanings");
                                wordData.user = doc.getString("user");
                                wordData.group = doc.getString("group");
                                wordData.uid = doc.getString("uid");
                                wordData.time = doc.getTimestamp("time");
                                wordData.isBookmarked = doc.getBoolean("isBookmarked");
                                wordData.documentId = doc.getId();

                                wordDataList.add(wordData);

                                // Sort words in abc order
                                Collections.sort(wordDataList, new Comparator<WordData>() {
                                    @Override
                                    public int compare(WordData o1, WordData o2) {
                                        return Integer.compare(o1.word.compareTo(o2.word), 0);
                                    }
                                });
                            }
                            wordList.setAdapter(new WordListAdapter(wordDataList,
                                    MainActivity.this, background));
                        }
                    }
                });
    }

    // WordListAdapter will call this function
    public void bookmarkWord(final WordData wordData) {
        reference = FirebaseFirestore.getInstance().collection("words");
        Log.d(TAG, "bookmarkWord: isBookmarked=" + wordData.isBookmarked);

        reference.document(wordData.documentId)
                .update("isBookmarked", wordData.isBookmarked)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "Set isBookmarked=" + wordData.isBookmarked
                                + " in documentId=" + wordData.documentId);
                        showWords(isBookmarkCheckboxChecked);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "Error setting isBookmarked", e);
                    }
                });
    }
}

오류 코드:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.tronix.kwakvoca, PID: 28433
    java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
        at com.tronix.kwakvoca.MainActivity$4.onEvent(MainActivity.java:200)
        at com.tronix.kwakvoca.MainActivity$4.onEvent(MainActivity.java:166)
        at com.google.firebase.firestore.Query.lambda$addSnapshotListenerInternal$2(com.google.firebase:firebase-firestore@@21.4.1:1045)
        at com.google.firebase.firestore.Query$$Lambda$3.onEvent(Unknown Source:6)
        at com.google.firebase.firestore.core.AsyncEventListener.lambda$onEvent$0(com.google.firebase:firebase-firestore@@21.4.1:42)
        at com.google.firebase.firestore.core.AsyncEventListener$$Lambda$1.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)