如何在双问号'??'上调试Null Safety默认值类型错误

问题描述

我最近在使用双问号时遇到一些奇怪的行为。 这是示例代码

void main() {
  String strA;
  String strB;

  print('start');
  strB = strA ?? 5; // wrong use of default value type. It should be a String here.
  print('end');
}

程序永远不会运行到最后,甚至不会抛出任何错误消息

这是预期的行为吗?

解决方法

您如何运行此代码?

运行它时,我得到以下输出:

▶ dart test.dart
start
Unhandled exception:
type 'int' is not a subtype of type 'String'
#0      main (file:///Users/renato/programming/projects/test.dart:6:3)

如我所料。

您正在使用哪个Dart版本(运行dart --version)?确保您拥有2.10之类的最新版本。

如果仍然有问题,则可能有一个本地analysis_options.yaml文件,该文件会覆盖Dart编译器检查以更宽松,在这种情况下,它可能不会检查类型(我不确定哪个选项可以启用此功能,但我想有可能。)

检查分析选项的工作方式here

我建议您始终通过将其添加到分析选项文件中来启用“强模式”:

analyzer:
  strong-mode:
    implicit-casts: false
    implicit-dynamic: false

顺便说一句,如果您想尝试新的Dart NNBD(非默认值)实验功能,则需要使用Dart开发者频道版本并使用dart --enable-experiment=non-nullable file.dart运行程序。

要了解如何启用NNBD,请查看null-safety tech preview 2博客文章。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...