开发者问题收集

无法读取空错误的属性“长度”

2017-03-04
5251

这是我的代码的错误:

   TypeError: Cannot read property 'length' of null
   at countPositivesSumNegatives
        at /runner/frameworks/javascript/cw-2.js:179:21
    at Promise._execute
    at Promise._resolveFromExecutor
    at new Promise
    at describe
            at Object.handleError
        at ContextifyScript.Script.runInThisContext
    at Object.exports.runInThisContext

目标是创建一个函数,该函数接受一个随机数字数组(输入),并返回正数的数量和负数的总和。除了我上面收到的错误消息外,一切都正常,该错误消息是针对错误值测试的,无论它意味着什么

function countPositivesSumNegatives(input) 
{
  let negSum = 0;
  let count = 0;
  let arr = [];

  for(i = 0; i < input.length; i++) { 
    if(input[i] > 0)
    { 
      count++;
    } 
    if (input[i] < 0) 
    { 
      negSum += input[i];
    }
    if (!input[i]) {
      negSum = negSum;
      count = count;
    }
  }

  arr.push(count,negSum);
    return arr;
  }
}
3个回答

听起来好像您的代码正在运行一些自动化测试,它们正在检查您如何处理错误输入。您的代码未设置为处理除预期的数字数组之外的任何内容,因此它无法通过这些测试。

您可以通过多种方式解决这个问题,但像

if (input === null) {
    return 'Input invalid'; // or something like that
}
// put your for loop here

这样简单的方法就可以解决问题。很有可能,您可能会面临更多需要处理的意外输入的测试用例。希望这对您有所帮助。

coralvanda
2017-03-04

正如 melpomene 所暗示的,抛出该类型错误是因为您试图在 null 对象上调用 .length

由于是“错误值测试”的结果,听起来像是针对您的解决方案运行测试套件,其中一个测试是检查您是否处理了错误的 input ,而您没有,因此出现错误。

我建议在开始处理 input 之前对其进行一些验证。只需在顶部放置一个 if 块,确保 input 不是 null ,实际上是一个数字数组。

我假设您有关于在 input 无效的情况下该怎么做的说明?也许只是返回?

jfriesenhahn
2017-03-04

您应该能够处理空数组..

以下是解决该问题的方法(检查是否为空):

function countPositivesSumNegatives(input) {
    let negSum = 0;
    let count = 0;
    let arr = [];
    if (input != null) {

        for (i = 0; i < input.length; i++) {
            if (input[i] > 0) {
                count++;
            }
            if (input[i] < 0) {
                negSum += input[i];
            }
            if (!input[i]) {
                negSum = negSum;
                count = count;
            }
        }
    }
    arr.push(count, negSum);
    return arr;
}
Maher Abuthraa
2017-03-04