跳到主要內容

not_assigned_potentially_non_nullable_local_variable

不可為空的區域性變數 '{0}' 必須在使用前賦值。

描述

#

當局部變數被引用且具有以下所有特徵時,分析器會產生此診斷資訊:

  • 具有一個潛在不可為空的型別。
  • 沒有初始化器。
  • 未標記為 late
  • 基於確定性賦值的規範,分析器無法證明該區域性變數在使用前已被賦值。

示例

#

以下程式碼會產生此診斷資訊,因為 x 不能擁有 null 值,但在賦值前被引用了:

dart
String f() {
  int x;
  return x.toString();
}

以下程式碼會產生此診斷資訊,因為對 x 的賦值可能不會執行,因此它可能擁有 null 值:

dart
int g(bool b) {
  int x;
  if (b) {
    x = 1;
  }
  return x * 2;
}

以下程式碼會產生此診斷資訊,因為基於確定性賦值分析,分析器無法證明 x 在未賦值的情況下不會被引用:

dart
int h(bool b) {
  int x;
  if (b) {
    x = 1;
  }
  if (b) {
    return x * 2;
  }
  return 0;
}

常見修復

#

如果 null 是一個有效值,那麼將變數設為可為空。

dart
String f() {
  int? x;
  return x!.toString();
}

如果 null 不是一個有效值,並且存在一個合理的預設值,那麼新增一個初始化器。

dart
int g(bool b) {
  int x = 2;
  if (b) {
    x = 1;
  }
  return x * 2;
}

否則,確保在訪問該值之前,所有可能的程式碼路徑上都已給變數賦值。

dart
int g(bool b) {
  int x;
  if (b) {
    x = 1;
  } else {
    x = 2;
  }
  return x * 2;
}

你也可以將變數標記為 late,這會消除診斷資訊,但如果變數在訪問前未賦值,則會在執行時丟擲異常。這種方法只應在你確定變數總是會被賦值的情況下使用,即使分析器無法基於確定性賦值分析來證明這一點。

dart
int h(bool b) {
  late int x;
  if (b) {
    x = 1;
  }
  if (b) {
    return x * 2;
  }
  return 0;
}