body_might_complete_normally

body_might_complete_normally

Dart 애널라이저가 생성하는 body_might_complete_normally 진단에 대한 설명이에요. 함수나 메서드가 잠재적으로 null이 아닌 타입을 반환 타입으로 갖는데, 함수 끝까지 실행되면 암시적으로 null을 반환할 때 발생해요.

출처: 원문

본문

메서드나 함수의 반환 타입이 잠재적으로 null이 아닌 타입인데 실행 흐름이 함수 끝에 도달하면 암시적으로 null을 반환하게 될 때 이 진단이 발생해요. 잠재적으로 null이 아닌 타입이란 명시적으로 null이 아닌 타입이거나 타입 매개변수 때문에 null이 아닌 타입을 말해요.

예시

아래 코드는 m 메서드가 암시적으로 null을 반환하는 return을 메서드 끝에 갖지만, 메서드가 null을 반환하지 않는 것으로 선언되어 있기 때문에 이 진단을 만들어요.

class C {
  int m(int t) {
    print(t);
  }
}

아래 코드는 m 메서드가 암시적으로 null을 반환하는 return을 메서드 끝에 갖지만, 클래스 C가 null이 아닌 타입 인자로 인스턴스화될 수 있기 때문에 메서드가 사실상 null을 반환하지 않는 것으로 선언된 셈이어서 이 진단을 만들어요.

class C<T> {
  T m(T t) {
    print(t);
  }
}

일반적인 수정 방법

반환할 만한 합리적인 값이 있다면 메서드 끝에 return 문을 추가해요.

class C<T> {
  T m(T t) {
    print(t);
    return t;
  }
}

메서드가 암시적 return에 도달하지 않을 것이라면 메서드 끝에 throw를 추가해요.

class C<T> {
  T m(T t) {
    print(t);
    throw '';
  }
}

메서드가 끝에서 의도적으로 null을 반환한다면 메서드 끝에 명시적인 null 반환을 추가하고, null을 반환해도 문제없도록 반환 타입을 변경해요.

class C<T> {
  T? m(T t) {
    print(t);
    return null;
  }
}

더 알아보기

반환 타입과 타입 매개변수, null 허용 여부(nullability)에 대한 더 자세한 내용은 Dart 언어 문서와 API 문서를 참고해요.