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)
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력