let SentryTime = setInterval(() => {
http.get('http://192.168.1.150:3000/api/status/' + sentryCode, {}, function (res, err) {
try {
if (err) return console.error('监听失败!');
let resData = res.body.json().data;
if (resData.status) {
console.log(SentryTime);
clearInterval(SentryTime);
console.log('检测到警报');
// if (!x2 || !y2 || !x3 || !y3 || !x4 || !y4) return alert('请先校准坐标!\n如不知如何校准,请联系相关人员获取校准视频!');
// if (!isRunning) startScript();
// else stopScript();
}
} catch (error) {
console.log(error);
}
});
}, 500);这段代码报错{ [JavaException:
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.stardust.autojs.core.loo per.Timer.clearlnterval(int)' on a null object reference]fileName: '<init>', lineNumber: 29}
回答
文档地址 https://docs.hamibot.com/
你遇到的错误是由于在 Rhino 1.7.15 环境中使用了 箭头函数表达式(=>),而 Rhino 不支持 ES6 的箭头函数语法,导致 setInterval 的回调未能正确执行,进而使 SentryTime 变量可能未被正确赋值或作用域异常,最终调用 clearInterval(SentryTime) 时传入了一个无效的 ID,引发 NullPointerException。
此外,clearInterval 是全局函数,但它操作的是由 setInterval 返回的定时器 ID。如果该 ID 没有被正确获取或保存,就会导致清除失败。
✅ 修复方案
将箭头函数改为普通函数,并确保 SentryTime 在作用域内可访问:
// 文档地址 https://docs.hamibot.com/
var SentryTime = setInterval(function() {
http.get('http://192.168.1.150:3000/api/status/' + sentryCode, {}, function(res, err) {
try {
if (err) {
console.error('监听失败!', err);
return;
}
var resData = res.body.json().data;
if (resData.status) {
console.log('检测到警报,停止轮询');
clearInterval(SentryTime);
toast('检测到警报');
// 这里可以执行你需要的操作,例如:
// startScript() 或 stopScript()
}
} catch (error) {
console.error('请求处理出错:', error);
}
});
}, 500);
🔍 错误原因说明
- Rhino 1.7.15 不支持箭头函数:Hamibot 使用的是 Rhino 引擎,目前不支持 ES6+ 的语法如
=>、const/let、默认参数等。 - 变量作用域问题:使用
let声明SentryTime在某些情况下可能导致闭包捕获异常,应使用var确保变量提升和作用域兼容。 - clearInterval 参数必须是有效的 setInterval 返回值:确保赋值成功且未被覆盖。
✅ 最佳实践建议
- 避免使用 ES6+ 语法:只使用
var、普通函数function()、不使用解构、模板字符串等。 - 始终检查网络请求结果:对
err和响应体做完整判断。 - 添加超时保护:防止无限循环请求耗电,可设置最大尝试次数或最长运行时间。
示例:带最大尝试次数限制
var maxAttempts = 60; // 最多尝试60次(约30秒)
var attemptCount = 0;
var SentryTime = setInterval(function() {
if (++attemptCount > maxAttempts) {
console.log('超过最大尝试次数,停止轮询');
clearInterval(SentryTime);
return;
}
http.get('http://192.168.1.150:3000/api/status/' + sentryCode, {}, function(res, err) {
if (err) {
console.error('请求失败:', err);
return;
}
var resData = res.body.json().data;
if (resData.status) {
console.log('检测到警报,停止轮询');
clearInterval(SentryTime);
toast('警报触发!');
}
});
}, 500);
这样可以提高脚本的稳定性和健壮性。