본문 바로가기

IT · 인터넷

[Java] NullPointerException: "Cannot invoke 'java.util.List.add(Object)' because '...' is null"

반응형

NullPointerException은 객체가 null일 때,

해당 객체의 메서드를 호출하거나 속성에 접근하려고 할 때 발생합니다.

 

이 오류 메시지에서 "java.util.List.add(Object)"는 List 객체의 add 메서드를 호출하려고 했으나,

해당 List 객체가 null이라는 것을 의미합니다.

 

 

NullPointerException 발생 원인

  • 객체가 초기화되지 않음: 객체를 생성하지 않고 사용하려고 할 때
  • 메서드의 반환값이 null: 메서드가 null을 반환하는 경우
  • 배열 요소가 null: 배열의 특정 요소가 null인 경우

 

예제 코드

import java.util.List;
import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        List<String> myList = null;

        // 이 줄에서 NullPointerException 발생
        myList.add("Hello");
    }
}

 

위 코드에서 myList는 null로 초기화되었습니다. 

myList.add("Hello")를 호출하려고 할 때, 

myList가 어떤 리스트도 가리키고 있지 않기 때문에 NullPointerException이 발생합니다.

 

오류 원인

  • 리스트 초기화 안 함: List 객체를 생성하지 않고 접근했기 때문에 발생합니다.
  • 메서드 인수로 null 전달: 메서드에서 List를 인수로 받아서 사용하려고 할 때 인수가 null인 경우

 

예외 방지 방법

#1 리스트 초기화: 사용하기 전에 List 객체를 반드시 초기화해야 합니다.

List<String> myList = new ArrayList<>();
myList.add("Hello"); // 정상 동작

 

#2 null 체크: add 메서드를 호출하기 전에 null인지 확인합니다.

if (myList != null) {
    myList.add("Hello");
} else {
    System.out.println("myList는 null입니다.");
}

 

#3 옵셔널 사용: Optional 클래스를 사용하여 null을 안전하게 처리할 수 있습니다.

import java.util.Optional;
import java.util.ArrayList;
import java.util.List;

public class OptionalExample {
    public static void main(String[] args) {
        List<String> myList = null;

        Optional<List<String>> optionalList = Optional.ofNullable(myList);
        optionalList.ifPresent(list -> list.add("Hello")); // 값이 존재할 때만 추가
    }
}

 

#4 예외 처리: 예외 발생 시 적절한 처리를 할 수 있습니다.

try {
    myList.add("Hello");
} catch (NullPointerException e) {
    System.out.println("NullPointerException 발생: myList는 null입니다.");
}

 

결론

NullPointerException은 객체가 null일 때 메서드를 호출하려고 할 때 발생합니다. 

이를 방지하기 위해 객체를 적절히 초기화하고, null 체크를 통해 안전하게 코드를 작성하는 것이 중요합니다. 

이러한 방법들을 통해 더 안정적이고 오류 없는 Java 프로그램을 작성할 수 있습니다.

반응형