Kotlin null 처리 상세 정보

3167 단어
Kotlin null 처리 상세 정보
Null Pointer Exception, 속칭 NPE라고 하는데 채소 새든 늙은 새든 모두 피할 수 없는 것이다. 자주 만나는 이상은 해석하기 매우 간단하다. 바로'공지침'세 글자다.항상 한 번 실수로 이 함정에 빠진다.Kotlin의 디자인 목표는 코드에서null 인용이 가져오는 위험, 즉 이른바 10억 달러의 손실을 초래하는 큰 오류를 없애는 것이다.
NPE의 이유
Kotlin은 코드의 NPE를 없애기를 원하지만, 우리는 항상 조심하지 않아서, 항상 조심하지 않으면 NPE의 함정에 빠진다. 다음은 가능한 NPE의 원인이다.
  • throw NullPointer Exception()
  • 명시적 호출
  • 사용!!조작부호
  • 외부 Java 코드로 인한 예외
  • 초기화 과정에서 일부 데이터가 일치하지 않음
  • NPE 방지
    Kotlin에서 null을 가리키는 인용 (null 인용 가능) 과 null을 가리키는 인용 (비null 인용) 을 명확하게 구분합니다.예를 들어 일반적인 String 유형 변수는null:
    
    var a: String = "abc"
    a = null //     

    이 때, a 변수에 대한 모든 호출은 안전합니다. 이것은 null이 아니기 때문에, 이 인용에 대해 NPE에 보고하지 않고 어떤 조작도 할 수 있습니다.설령 a에 널을 부여한다 하더라도 컴파일러는 너를 통과시키지 않을 것이다.
    그러나 실제 개발할 때 모든 변수가null이 될 수 없습니다. 항상 상황이 있을 수 있습니다. 변수는null입니다. 이때 이 변수를 어떻게 설정해야 합니까?null 값의 변수를 허용하려면 변수를 null 문자열로 선언하고 String을 작성할 수 있습니다.
    
    var b: String? = "abc"
    b = null // ok

    이렇게 해서 우리는 변수를null로 설정할 수 있는 문제를 해결했는데 NPE의 이 함정이 또 설치되었다. 만약에 더 부주의하면 NPE가 또 문제를 일으킬 것이다.
    만약 우리가 여전히 이 속성에 접근해야 한다면, 그렇지 않습니까?다음과 같은 몇 가지 방법이 있습니다.
    조건문에서null 검사
    조건문을 통해 변수가null인지 확인하고null과 비null의 두 가지 상황을 각각 처리합니다.
    
    if (b != null && b.length > 0)
      print("String of length ${b.length}")
    else
      print("Empty string")
    
    

    참고:
    이 방안은 현재 b의 값만 대상으로 하고 b의 값이 검사된 후에 b의 값이 수정되면 이 값에 대해 비null 검사를 해야 한다. 즉, 매번 b의 값을 수정할 때마다 반드시 b에 비null 검증을 해야 하기 때문에 코드의 군더더기를 초래한다.
    안전 호출
    무엇이 안전 호출입니까?좀 이해가 안 가는 것 같은데,null인데 어떻게 안전할 수 있겠어요?
    
    b?.length

    Kotlin에서?. 사용 가능조작부호 호출 변수는 b가null이 아니라면 이 표현식은 b.length로 되돌아오고 그렇지 않으면null로 되돌아온다는 뜻이다."?"를 사용한다면,표현식의 값도 null이어야 합니다. 예를 들어 Int?,그렇지 않으면 컴파일러가 잘못 보고할 것이다.
    
    bob?.department?.head?.name

    안전 호출은 체인식 호출 상황에서 매우 유용하다.이러한 체인 호출은 속성 체인의 어떤 속성이null이면 전체 표현식은null로 되돌아옵니다.
    ?:조작부호
    만약?:왼쪽의 표현식 값이null이 아니면 표현식의 값을 되돌려줍니다. 그렇지 않으면 오른쪽 표현식의 값을 되돌려줍니다.
    
    val l = b?.length ?: -1

    b가null이 아니면 b의 길이를 되돌려주고,null이면 -1을 되돌려줍니다
    참고:
    왼쪽 표현식 값이null일 때만 오른쪽 표현식을 계산합니다.
    Kotlin에서throw와return은 모두 표현식이기 때문에 Elvis 조작부호의 오른쪽에도 사용할 수 있습니다.이런 용법은 매우 큰 편리를 가져올 수 있다. 예를 들어 함수 매개 변수의 값이 합법적인지 검사하는 데 쓸 수 있다.
    
    fun foo(node: Node): String? { 
    val parent = node.getParent() ?: return null 
    val name = node.getName() ?: throw IllegalArgumentException(“name expected”) 
    // … 
    } 
    

    !! 조작부호
    b가null이 아닌 경우, 이 표현식은 이 비null 값을 되돌려줍니다. (예를 들어, 우리의 예에서 하나의String 형식 값입니다.) b가null이면 이 표현식은
    NPE:
    
    val l = b!!.length()

    b가null일 때 이상을 던질 수 있습니다. 당신은 그것을 잡을 수 있습니다. 어느 구석에서 호출되었는지 모를 때 이상을 보고하고, 머리를 잡고 볼을 한참 동안 긁고서야 NPE가 어디에 있는지 찾을 수 있습니다.
    안전한 유형 변환
    대상이 우리가 원하는 목표 유형이 아니라면, 일반적인 유형 변환은 ClassCastException을 초래하여 안전한 유형 변환을 사용할 수 있습니다. 변환이 성공하지 않으면,null로 되돌아와, 변환이 이상하게 던지는 것을 피할 수 있습니다.
    
    val aInt: Int? = a as? Int

    읽어주셔서 감사합니다. 여러분께 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

    좋은 웹페이지 즐겨찾기