我正在使用以下代码,该代码效果很好但完全停止工作时#34; thsub"为null并且不会继续读取其余数据,只返回一个TypeError,表示" thsub in null"
以下是代码:
part2 = part[:] #This will create a copy
part2.remove(p1)
happ = p1 + ' ' + random.choice(acon) + ' ' + random.choice(part2)
我该如何解决这个问题?
答案 0 :(得分:4)
它会因为您引用thsub
的{{1}}属性而中断。由于length
没有属性,而且不能,这将引发错误。在这种情况下以及您使用null的所有其他情况下,这可以通过添加某种条件来轻松解决,这些条件会破坏循环或避免执行代码。
这是一个简单的例子:
null
注意添加的for (var l = 0, m = data.cars.length; l < m; l++) {
if (data.cars[l].thsub) {
for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) {
if (data.cars[l].thsub[i].stats) {
thCount[l]+=data.cars[l].thsub[i].stats.items;
}
}
}
}
- 如果此值为null,则条件将评估为false,并且异常引起的代码将永远不会执行。
答案 1 :(得分:1)
只需在访问属性之前添加保护条件,如果您尝试在null
或undefined
对象上调用属性,则会引发错误。
for (var l = 0, m = data.cars.length; l < m; l++) {
thCount[l] = 0;
let tsubs = data.cars[l].thsub || []; <--- Guard condition
for (var i = 0, j = tsubs.length; i < j; i++) {
if (data.cars[l].thsub[i].stats) {
thCount[l] += data.cars[l].thsub[i].stats.items;
}
}
}
在固定用例中,当属性访问返回虚假值时,tsubs
将被设置为空数组。
答案 2 :(得分:1)
你的循环正在检查thsub的长度属性。如果thsub为null,那么您的代码正在尝试检查空对象的属性(长度),这将始终破坏您的代码。尝试在检查长度之前添加对thsub对象本身的检查:
for (var l = 0, m = data.cars.length; l < m; l++) {
thCount[l] = 0;
if (data.cars[l].thsub) {
for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) {
if (data.cars[l].thsub[i].stats) {
thCount[l]+=data.cars[l].thsub[i].stats.items;
}
}
}
}
工作样本:
答案 3 :(得分:0)
首先检查thsub
变量:
var thsub;
for (var l = 0, m = data.cars.length; l < m; l++) {
thCount[l] = 0;
thsub = data.cars[l].thsub;
if (!(thsub instanceof Array)) continue; // If it's not an array, skip it.
for (var i = 0, j = thsub.length; i < j; i++) {
if (!thsub[i].stats) continue; // If it doesn't contain 'stats', skip it.
thCount[l] += thsub[i].stats.items;
}
}