NodeJS使用readline读取整数行报错TypeError: Cannot read property 'split' of undefined
问题:Node.js readline模块读取整数时报错TypeError: Cannot read property 'split' of undefined
在使用Node.js的readline模块读取一行整数时,触发了TypeError: Cannot read property 'split' of undefined错误。预期功能是读取一行中的4个整数,按规则输出结果,报错代码如下:
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var entry= []; rl.on('line', function (data) { entry.push(data); //Want to get 4 integers (later A, B, C, D) }); rl.on('close', () => { var data = entry[0].split(' '); if (+data[3]<=+data[1]) { //If D<=B then output A process.stdout.write(data[0].toString()); } else { //Else output by formula "A + (D-B)*C" process.stdout.write((data[0]+(data[3]-data[1])*data[2]).toString()); } });
错误原因
- 核心报错原因:
entry[0]为undefined,说明close事件触发时,line事件从未执行——程序未读取到任何输入就结束了。 - 潜在逻辑问题:代码中未对字符串类型的输入做数值转换,直接执行加法会触发字符串拼接,导致计算结果错误。
修复方案
方案1:读取输入后立即处理(推荐)
在line事件中直接处理输入,完成计算后关闭接口,避免依赖close事件时entry为空的情况:
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.on('line', function (data) { // 分割输入字符串并转换为整数 const [A, B, C, D] = data.split(' ').map(Number); let result; if (D <= B) { result = A; } else { result = A + (D - B) * C; } process.stdout.write(result.toString() + '\n'); // 处理完成后关闭接口 rl.close(); }); rl.on('close', () => { process.exit(0); });
方案2:增加空值判断(兼容无输入场景)
如果需要保留close事件的处理逻辑,必须先判断输入是否存在,同时修正数值类型问题:
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin, output: process.stdout }); var entry= []; rl.on('line', function (data) { entry.push(data); }); rl.on('close', () => { // 先判断是否有有效输入 if (!entry[0]) { process.stdout.write('无有效输入\n'); return; } // 分割字符串并转换为数字 const [A, B, C, D] = entry[0].split(' ').map(Number); let result; if (D <= B) { result = A; } else { result = A + (D - B) * C; } process.stdout.write(result.toString() + '\n'); });
内容的提问来源于stack exchange,提问作者К Е
相关产品推荐
相关产品推荐

