Dart创建类实例报Null check operator used on a null value错误原因
错误原因
Dart中的!是空断言操作符,作用是强制把可空类型转换为非空类型,如果运行时被操作的值实际为null,就会直接抛出Null check operator used on a null value运行时错误。
你的代码触发错误的具体原因:
MyClass构造函数的入参callback声明为可空类型MyClassCallback?,允许传入null值- 构造函数初始化列表中对
callback使用了!非空断言,但你在main函数中调用构造时实际传入了null,运行时直接触发断言失败 - 即使成员变量
_callback本身是可空类型,只要对入参的null值执行了!操作,就会在构造阶段直接抛出错误,不会走到给_callback赋值的步骤
修复方案
根据业务需求可以选择两种修复方式:
- 要求必须传入非空回调:把构造函数入参改为非空类型,移除
!操作符,编译期就会拦截传null的错误,不会留到运行时触发
abstract class MyClassCallback { void onFinish(); } class MyClass { MyClassCallback _callback; // 直接用语法糖绑定成员变量,无需额外赋值 MyClass(MyClassCallback this._callback); } void main() { // 此处传null会直接编译报错,提前发现问题 // var o = new MyClass(null); }
- 允许不传回调(即允许入参为null):直接移除
!操作符即可,可空值可以直接赋值给可空的成员变量
abstract class MyClassCallback { void onFinish(); } class MyClass { MyClassCallback? _callback; MyClass(MyClassCallback? callback) : _callback = callback; } void main() { var o = new MyClass(null); // 后续使用_callback时用条件调用即可避免空错误 // o._callback?.onFinish(); }
内容的提问来源于stack exchange,提问作者sunjinbo
相关产品推荐
相关产品推荐

