我有一些代码,当我运行它时会产生一个错误,说:
NoSuchMethod:方法"XYZ"是在空上调用的
这意味着什么?我该如何修复它?
为什么会出现此错误
示例
作为现实世界的比较,刚刚发生的是这样的对话:
嘿,汽车油箱里还剩多少汽油?
你在说什么,我们没有汽车。
这正是您的程序中正在发生的事情。您想调用类似_car.getGasLevel();
的函数,但没有car,变量_car
是null
。
显然,在你的程序中,它可能不是一辆汽车。它可以是一个列表、一个字符串或其他任何东西。
技术说明
您正试图使用一个null
变量。要么你已经明确地将它设置为null
,要么你根本没有设置它,默认值是null
。
与任何变量一样,它也可以传递到其他函数中。您得到错误的地方可能不是来源。您必须遵循从实际null
值到其最初来源的线索,以找到问题所在以及可能的解决方案
null
可以有不同的含义:没有设置为另一个值的变量将是null
,但有时程序员故意使用空值来表示没有值。数据库具有可为null的字段,JSON缺少值。丢失的信息实际上可能是信息本身。例如,当用户说是时,变量bool userWantsPizzaForDinner;
可用于true
,当用户拒绝时,变量为false
,而当用户尚未选择某个内容时,变量可能仍然为null
。这不是一个错误,它是故意使用的,需要相应地处理。
我该如何修复它
找到它
使用错误消息附带的堆栈跟踪可以准确地找出错误所在的行。然后在该行设置断点。当程序到达断点时,检查变量的所有值。其中一个是null
,找出哪一个。
修复它
一旦你知道它是哪个变量,就知道它是如何变成null
的。它是从哪里来的?这个值一开始就没有设定过吗?这个值是另一个变量吗?那个变量是如何得到它的值的。这就像一条面包屑线,你可以一直沿着它走,直到你到达一个点,你发现某个变量从未被设置,或者你可能到达一个点将某个变量故意设置为null
。如果它是无意的,只需修复它。将它设置为您希望它具有的值。如果这是故意的,那么您需要在程序中进一步处理它。也许你需要另一个if
来为这个案子做一些特别的事情。如果有疑问,你可以问有意将其设置为null
的人他们想要实现什么。
简单地说,您试图从类访问的变量/函数不存在
someClass.xyz();
以上将给出错误
NoSuchMethod: the method 'xyz' was called on null
因为类别CCD_ 19不存在
以下内容将适用于
// SomeClass created
// SomeClass has a function xyz
class SomeClass {
SomeClass();
void xyz() {
print('xyz');
}
}
void main() {
// create an instance of the class
final someClass = SomeClass();
// access the xyz function
someClass.xyz();
}