문제상황:
Java 코드에서 NullPointerException이 발생했습니다. 여러 객체들을 다루고 있고, 여기서 null 값이 발생한 것 같습니다. 이 문제를 해결하기 위해 에러 발생한 코드와 로그를 분석해보겠습니다.
에러가 발생한 코드:
public class UserManager {
private UserRepository userRepository;
public void processUser(String userId) {
User user = userRepository.findById(userId);
user.setLastLogin(LocalDateTime.now());
userRepository.save(user);
}
}
에러로그 내용:
java.lang.NullPointerException
at com.example.UserManager.processUser(UserManager.java:7)
해결방법:
에러가 수정된 코드 및 수정된 부분에 대한 주석:
public class UserManager {
private UserRepository userRepository;
// 생성자를 통해 UserRepository 주입
public UserManager(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void processUser(String userId) {
User user = userRepository.findById(userId);
if (user != null) { // null 체크 추가
user.setLastLogin(LocalDateTime.now());
userRepository.save(user);
}
}
}
원인분석:
NullPointerException은 Java에서 객체 참조가 null일 때 해당 객체의 메소드나 속성에 접근하려 할 때 발생합니다. 이 문제는 코드의 여러 부분에서 발생할 수 있지만 이 경우에서는 UserManager 클래스의 processUser 메소드에서 발생했습니다.
에러 발생 원인과 해결된 코드의 작동 원리를 단계별로 설명하겠습니다.
- 에러 발생 원인: UserManager 클래스에서 userRepository 객체를 사용하려고 했으나, 초기화되지 않아 null 상태였습니다. 그 결과, userRepository.findById(userId) 코드에서 NullPointerException이 발생했습니다.
- 해결된 코드의 작동 원리: UserManager 클래스에 생성자를 추가하여 userRepository 객체를 주입받도록 했습니다. 이렇게 하면 userRepository가 초기화되어 null이 아닌 상태로 사용할 수 있습니다. 또한, processUser 메소드에서 user 객체가 null인지 확인하는 조건문을 추가하여, null인 경우에는 setLastLogin 및 save 메소드를 호출하지 않도록 했습니다.
참고링크:
728x90