개발/JAVA

에러 노트: NullPointerException - 포인트 값이 없을 경우

aihtnyc_h 2024. 11. 27. 21:23
728x90
반응형
SMALL

### 에러 노트: NullPointerException - 포인트 값이 없을 경우

#### 발생 원인:

- **`NullPointerException` 발생**: `MobilePoint` 객체가 `null`일 경우, `point.getPoint()` 메소드 호출에서 `NullPointerException`이 발생.
    - **기존 코드**:

        return new PageImpl<>(list.getResults().stream()       
        .map(tuple -> {           
        MobileUsers data = tuple.get(userInfo);           
        MobilePoint point = tuple.get(userPoint);           
        return new MobileUserDTO.UserListData(               
        point.getPoint()          
        );       
        })       
        .collect(Collectors.toList()), pageable, list.getTotal());


        
    - **문제**: `point`가 `null`일 때 `point.getPoint()`를 호출하려고 해서 `NullPointerException`이 발생.
    - **해결 코드**:

        return new PageImpl<>(list.getResults().stream()       
            .map(tuple -> {           
            MobileUsers data = tuple.get(userInfo);           
        MobilePoint point = tuple.get(userPoint);           
        return new MobileUserDTO.UserListData(               
        point != null && point.getPoint() != null ? point.getPoint() : 0               
        // point가 null일 경우 0 반환           
        );       
        })       
        .collect(Collectors.toList()), pageable, list.getTotal());


#### 영향 범위:

- **NullPointerException**: `MobilePoint` 객체가 `null`일 경우, `point.getPoint()` 호출 시 예외가 발생하여 애플리케이션이 중단될 수 있음.
- **데이터 처리 오류**: `point`가 `null`인 경우에도 `getPoint()`를 안전하게 처리하지 않으면, 해당 사용자에 대한 데이터를 처리할 수 없거나, 오류가 발생하여 결과가 정상적으로 반환되지 않음.

#### 주요 프로세스 영향:

1. **데이터 조회 실패**:
    - `MobilePoint` 객체가 `null`인 경우, `point.getPoint()` 호출에서 오류가 발생하여, 해당 사용자의 정보가 잘못 처리되거나 조회되지 않음.
2. **응답 지연**:
    - 예외가 발생하여 요청이 실패하거나 예외 처리 로직으로 넘어가게 되어, 응답 시간이 지연될 수 있음.
3. **서비스 장애**:
    - `NullPointerException`으로 인해 서비스가 중단되거나, 일부 기능이 정상적으로 작동하지 않음.

#### 해결 방안:

1. **`null` 체크 추가**:
    
    - `MobilePoint` 객체가 `null`일 경우, `getPoint()`를 호출하지 않도록 `null` 체크를 추가하여 `NullPointerException`을 방지.
    - `point`가 `null`일 경우에는 기본 값(예: `0`)을 반환하도록 처리.
    - **수정된 코드**:

return new PageImpl<>(list.getResults().stream()       
  .map(tuple -> {           
  MobileUsers data = tuple.get(userInfo);           
  MobilePoint point = tuple.get(userPoint);           
return new MobileUserDTO.UserListData(               
point != null && point.getPoint() != null ? point.getPoint() : 0               
// point가 null일 경우 0 반환           
);       
})       
.collect(Collectors.toList()), pageable, list.getTotal());


        
2. **`Optional` 사용**:
    
    - `Optional`을 사용하여 `null` 처리를 더 안전하게 할 수 있음. 예를 들어, `point.getPoint()` 대신 `Optional.ofNullable(point).map(MobilePoint::getPoint).orElse(0)`와 같이 처리할 수 있음.
       

   return new PageImpl<>(list.getResults().stream()       
   .map(tuple -> {           
   MobileUsers data = tuple.get(userInfo);           
   MobilePoint point = tuple.get(userPoint);           
   return new MobileUserDTO.UserListData(               
   Optional.ofNullable(point).map(MobilePoint::getPoint).orElse(0)           
   );       
   })       
   .collect(Collectors.toList()), pageable, list.getTotal());


        
3. **테스트 및 검증**:
    
    - 수정된 코드가 정상적으로 동작하는지 확인하기 위해, `point`가 `null`인 경우와 아닌 경우에 대해 다양한 테스트를 진행.
    - 특히 `point`가 `null`일 때 결과가 `0`으로 반환되는지 검증.
4. **로깅**:
    
    - `point`가 `null`인 경우에 대한 로깅을 추가하여, 데이터가 `null`인 이유와 함께 문제를 추적할 수 있도록 함.
    - 예시:

if (point == null) {     
log.warn("MobilePoint is null for user: {}",data.getId()); 
}



#### 결론:

`MobilePoint` 객체가 `null`일 경우 `getPoint()` 메소드 호출에서 `NullPointerException`이 발생하는 문제를 해결하기 위해 `null` 체크를 추가하여 안전하게 처리하도록 수정해야 합니다. `Optional`을 사용하면 코드가 더 깔끔하고 안전하게 `null` 값을 처리할 수 있습니다. 이를 통해 애플리케이션이 중단되지 않고 정상적으로 데이터를 처리할 수 있습니다.

728x90
반응형
LIST