초기화되지 않은 non-nullable 인스턴스 필드
초기화되지 않은 non-nullable 인스턴스 필드 (not_initialized_non_nullable_instance_field)
인스턴스 필드가 non-nullable 타입인데 초기화되지 않았을 때 나오는 진단이에요. 메시지는 "Non-nullable instance field '{0}' must be initialized." — "non-nullable 인스턴스 필드 '{0}'은(는) 초기화되어야 해요"라고 알려줘요.
본문
언제 발생하나요?
애널라이저가 필드 선언을 살펴보다가 이 필드가 아래 성질을 전부 갖고 있으면 이 진단을 내요.
- 타입이 non-nullable이에요.
- 초기화식(initializer)이 없어요.
late로 표시되지 않았어요.
필드는 초기화되지 않으면 보통 null로 암묵적으로 초기화돼요. 그런데 타입이 non-nullable이면 null이 허용되지 않으니, 어딘가에서 반드시 값을 채워 줘야 해요.
예시
다음 코드는 x가 non-nullable인데 아무 초기화도 없어서, null이 허용되지 않는 상황에서 null로 암묵 초기화되므로 이 진단이 발생해요.
class C {
int x;
}
비슷하게, 다음 코드는 생성자 중 하나가 x를 null로 암묵 초기화하는데 null이 허용되지 않아서 발생해요. 다른 생성자에서는 초기화하더라도, C.n()을 통해 만들어진 인스턴스의 x는 값이 채워지지 않거든요.
class C {
int x;
C(this.x);
C.n();
}
C(this.x); 생성자로는 x가 채워지지만, C.n(); 생성자는 x를 건드리지 않아요. 그래서 C.n()으로 만든 인스턴스의 x는 null로 남게 되고, 이게 허용되지 않죠.
어떻게 고치나요?
모든 인스턴스에서 같은 값인 합리적인 기본값이 있다면, 필드에 초기화식을 추가해요.
class C {
int x = 0;
}
필드의 값을 인스턴스를 만들 때 제공해야 한다면, 필드의 값을 설정하는 생성자를 추가하거나 기존 생성자를 고치면 돼요.
class C {
int x;
C(this.x);
}
필드를 late로 표시할 수도 있어요. 그러면 이 진단은 사라져요. 다만 값이 대입되기 전에 접근하면 런타임에서 예외가 던져지거든요. 이 방법은 필드가 참조되기 전에 항상 값이 대입될 거라고 확신할 수 있을 때만 쓰는 게 좋아요.
class C {
late int x;
}
더 알아보기
- non-nullable 안전성 전반은 Null safety 문서에서 확인할 수 있어요.
- 다른 진단과 함께 보려면 Diagnostics 목록을 참고하세요.