Scala에서 implicit converion 때문에 NPE 에러가 발생하는 경우 해결 방법은?

2015-12-29 14:10

Java 코드를 Scala 코드로 변경하다보면 implicit conversion 때문에 NullPointerException이 발생하는 경우가 종종 있다.

예들 들어 다음과 같은 경우이다.

  @Test def moveToTag_부모_태그_ID_is_null {
    val parentTagId: Long = null
    val newTag: Tag = aTag.withId(1L).withName("newTag").build
    when(tagRepository.findOne(parentTagId)).thenReturn(null)
    when(tagRepository.findOne(newTag.getTagId)).thenReturn(newTag)
    dut.moveToTag(newTag.getTagId, parentTagId)
    assertThat(newTag.isPooled, is(true))
  }

위 소스 코드를 실행하면 다음과 같은 에러가 발생한다.

java.lang.NullPointerException
    at scala.Predef$.Long2long(Predef.scala:358)
    at net.slipp.service.tag.TagServiceTest.moveToTag_부모_태그_ID_is_null(TagServiceTest.scala:29)

위와 같은 에러가 발생하는 원인은 값이 null인 parentTagId를 implicit conversion이 발생하기 때문이다. 이 에러를 해결하는 방법은 Long type에 대한 implicit conversion이 발생하지 않도록 명시적으로 java.lang.Long을 import하는 것이다.

이 보다 더 좋은 해결 방법은 null 값을 직접 사용하지 않고 Option을 사용하는 것이다. Option에 대한 구체적인 내용은 Java 소스를 Scala로 전환할 때 null 값 처리는? 문서를 참고한다.

0개의 의견 from SLiPP

의견 추가하기