为什么我会收到这个 NoSuchMethodError?

时间:2021-04-14 12:37:38

标签: dart error-handling compiler-errors command-line-interface

我有这个代码

String encrypt(String x) {
    String out;
    var _x = x.codeUnits;
    List dict;
    /* <dict_assignment> */
    dict[0] = 'a';
    dict[1] = 'b';
    dict[2] = 'c';
    dict[3] = 'd';
    dict[4] = 'e';
    dict[5] = 'f';
    dict[6] = 'g';
    dict[7] = 'h';
    dict[8] = 'i';
    dict[9] = 'j';
    /* </dict_assignment> */
    _x.toList().forEach((i) {
      var _i = i.toString();
      _i.split("").forEach((k) {
        var _k = int.parse(k);
        print(_k);
        print(dict[_k]);
        out += dict[_k];
      });
    });
    return out;
  }

(是的,我在 Dart 中编写 HTML 标签作为注释......起诉我) (不知道为什么我的缩进乱七八糟)

出于某种原因,当我对这样的随机字符串使用相同的函数时

var x = encrypt("hmm interesting");

我一直收到这个

Unhandled exception:
NoSuchMethodError: The method '[]=' was called on null.
Receiver: null
Tried calling: []=(0, "a")
#0      Object.noSuchMethod (dart:core-patch/object_patch.dart:54:5)

请帮帮我,我真的很困惑为什么会这样

1 个答案:

答案 0 :(得分:1)

您尚未初始化 dict 变量,因此它包含 null

如果您将 List dict; 更改为 List dict = [];,则 那个 将开始工作。 您还没有初始化 out

代码的其余部分倾向于过于复杂,并且也可以进行优化。这是一个建议:

String encrypt(String x) {
  var out = StringBuffer();
  const dict = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
  for (var i in x.codeUnits) { // x.codeUnits is a list. Use for-in to iterate it.
    for (var k in i.toString().codeUnits) {
      var _k = k ^ 0x30; // Best way to convert code unit for 0-9 into integer 0-9.
      // print(_k);
      // print(dict[_k]);
      out.write(dict[_k]); // Use a StringBuffer instead of repeated concatenation.
    }
  }
  return out.toString();
}

它似乎不是可解密的加密。字符串 "77" 和字符串 "ᖳ"(又名 "\u15b3")都加密为“ffff”。

或者,如果你想“编码高尔夫”而不是可读或接近原作,它也可以是单行的:

String encrypt(String x) => [
      for (var i in x.codeUnits)
        for (var k in "$i".codeUnits) "abcdefghij"[k ^ 0x30]
    ].join("");
相关问题