본문 바로가기

카테고리 없음

자바에서 null을 안전하게 다루는 법

https://www.youtube.com/watch?v=vX3yY_36Sk4 스프링캠프2019 

유튜브 알고리즘을 타던 중 이와 같은 영상을 보게 되었고, 정리를 하고 싶어졌다. 

 

null이란?

크게 2가지로 나눌 수 있다. 

1. Unique Empty String 

길이가 0인 문자열. 

https://en.wikipedia.org/wiki/Empty_string

 

2. Null pointer, Null Reference로 불리는 유효하지 않은 객체를 가리키는 것 . 

자바에서 Initialize를 하지 않은 객체를 수정하거나 접근하려고 하면  볼수 있는 NPE이다. 

 

npe는 runtimeException이자 uncheckedException으로 컴파일 시점에는 확인할 수가 없어 프로그래머의 프로그래밍 역량에 따라 빈번하게 발생할 수 있다. 

 

방지하는 방법 

 

java 8이후로 괜찮은 방법들이 쏟아지고 있고, 아예 언어차원에서 jvm의 다른 언어(Kotlin) 들이 다양하게 지원하고 있다.  

 1. 삼항연산 

    String str = (param == null) ? "NA" : param;

 2. 라이브러리사용 ( apache common lang의 StringUtils Class)

    StringUtils.isNotEmpty()

    StringUtils. IsEmpty()

    StringUtils.equals()

    StringUtils.equals()

 3.Fail Fast Method Arguments

    메서드 초기에 null체크 하는 것. 

 4. Objects 대신에 Primitives를 고려하는 것 . 

     객체를 참조하지 않으면 null pointer가 발생하지도 않을 것. 

 5.  체인드 메서드 호출을 지양할 것. 

    ex) ref.method1().method2().method3().methods4();

     디버그가 어려워진다. 

  6.  toString()보다는 valueOf() 

     valueOf()는 Null체크가 내장되어 있다. 

 7. Method에서 null반환 피하기. (--> 빈 문자열,컬렉션,자바8이후의 Optional)

 List<String> data = null;

@SuppressWarnings("unchecked")
public List getDataDemo()
{
  if(data == null)
     return Collections.EMPTY_LIST; //Returns unmodifiable list
  return data;
}

8. 메서드의 인자가 2개이상일때 하나의 인자로  null을 요구하는 경우를 피해라 . 

   대신에 , 메서드를 2개를 만들어라. 파라미터 1개를 지니는 메서드와 , 2개이상의 메서드를 지니는 경우로 . 

 

 9 . equal()사용 시 안전한 사용법 

   

  String param = null;
//  npe발생
  if (param.equals("check me")) {
   }
  //npe발생x
  if ("check me".equals(param)) {
  }

  equals()는 내부적으로 주소값부터 비교를 하기 때문에 참조변수를 뒤에다 놓는 것이 좋다. 

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (!COMPACT_STRINGS || this.coder == aString.coder) {
                return StringLatin1.equals(value, aString.value);
            }
        }
        return false;
    }

 

참고

https://howtodoinjava.com/java/exception-handling/how-to-effectively-handle-nullpointerexception-in-java/

https://en.wikipedia.org/wiki/Null_pointer

https://www.oracle.com/technical-resources/articles/java/java8-optional.html