UMC🚀

[inteillij][spring]NullPointerException 에러 해결기

개발자 덕구🐾 2022. 2. 13. 00:49
728x90

 

 

 

또래에게 편지를 발송하는 로직에서 +-5살의 5명에게 보낸다.

문제는 또래가 5명이 없을 때 발생한다.

 

그래서 5명이 존재하지않는다면 또래가 아닌 사람중에서 랜덤으로 

선택된 또래를 제외한 다른 유저에게 보내는 로직을 만들었다.

(5명보다 작은 또래들에게는 보낸다. 나머지를 랜덤으로)

 

나는 그냥 5명보다 작으면 5명 전부 랜덤으로 보낼려고 했는데

팀장 레마가 map을 이용하여 일기쪽을 만들었다는 것을 알려주어 자신감을 얻어 구현하였다.

 

랜덤으로 5명을 뽑을 때 5명이 아니여도 에러가 발생하지않는다는 것을 확인하고

뽑힌 또래에게는 보내고 나머지 유저를 랜덤으로 골라 보내도록 로직을 만들었다. 

 

맵을 사용하였다.

<처음에 만든 코드>

 if (idx_similar.getUserSimilarAge() == 1){// 편지 발송 유저가 또래 편지 수신을 원할경우
                List<Integer> receiveUserIdx_similar =letterDao.getLetterUserIdx_Similar(idx_similar);
                    // 휴먼상태가 아닌 또래의 user 5명을 랜덤으로 골라 편지 발송 //letterSendList에 추가
                for (int i = 0; i < receiveUserIdx_similar.size(); i++) { //(최대 5명) 5명의 userIdx를 뽑는다. // 1명씩 테이블에 추가하므로 5번 반복
                    letterDao.createLetterSendList(letterIdx,receiveUserIdx_similar,i);
                }
                if (receiveUserIdx_similar.size() < 5 ){ // 또래의 유저가 5명 미만이라면
                    Map<Integer, Integer> letterIdxMap = new HashMap<>(); // key = diaryIdx, value = 해당 일기가 발송된 횟수 (현재까지 몇명에게 보내졌는가?)
                    for (int pastSend : receiveUserIdx_similar) {
                        letterIdxMap.put(pastSend, 1); // 이미 편지를 보낸 유저의 값을 1로 지정
                    }
                    //  (5 - 선택된 유저) 만큼 랜덤으로 보낼 유저 인덱스의 리스트 만들기
                    List<Integer> receiveUserIdx_Random =letterDao.getLetterUserIdx_Random(idx_similar);
                    // 또래 이외에 (5 - 선택된 유저) 만틈 랜덤으로 선택한 유저에게 편지 발송
                    int sendUserIdx = 0;
                    for (int j = 0; j < (5-receiveUserIdx_similar.size()); j++,sendUserIdx++){
                        int userIdx = receiveUserIdx_Random.get(sendUserIdx);
                        if (letterIdxMap.get(userIdx) == 1) { // 만약 이미 편지를 보낸 유저라면
                            j -= 1; // 편지를 보낸 수 줄이기
                            continue;
                        }
                        letterDao.createLetterSendList(letterIdx,receiveUserIdx_Random,sendUserIdx);
                    }
                }
                PatchModifyScoreRes ModifyScore = plantService.modifyScore_plus(postLetterReq.getUserIdx(), Constant.PLANT_LEVELUP_LETTER,"letter");
                String senderNickName = getNickName(postLetterReq.getUserIdx());
                PostLetterPlantRes result_similar = new PostLetterPlantRes(letterIdx,senderNickName,receiveUserIdx_similar,ModifyScore );
                return result_similar;
            }

 

그러나! 에러가 발생하였다.

에러의 이름은 이 글의 이름인 NullPointerException 이다.

 

null값과 관련되어있는 모양인데 

잘 모르겠어서 LetterService.java의 62번째 줄을 확인하였다. 

 

문제가 발생한 곳을 확인하니 이유를 알아냈다.

 

map에 키가 없는 것이다!

map에는 앞서 또래의 userIdx만 1값으로 되어있지 랜덤으로 뽑은 유저의 값들이 0으로 되어있는 것이 아니기때문이다.

 

 

그래서 null 관련에러가 발생했던 것이다. 

 

 

 

containKey를 이용해 비교하는 것으로 변경하였다!

 

 

오예~ 5개가 잘 나온다. 

반응형