You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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赋值的步骤
修复方案

根据业务需求可以选择两种修复方式:

  1. 要求必须传入非空回调:把构造函数入参改为非空类型,移除!操作符,编译期就会拦截传null的错误,不会留到运行时触发
abstract class MyClassCallback {
    void onFinish();
}

class MyClass {
    MyClassCallback _callback;

    // 直接用语法糖绑定成员变量,无需额外赋值
    MyClass(MyClassCallback this._callback);
}

void main() {
   // 此处传null会直接编译报错,提前发现问题
   // var o = new MyClass(null); 
}
  1. 允许不传回调(即允许入参为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:45:02