var SentryTime = setInterval(function () {
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/
你遇到的 NullPointerException 错误:
Attempt to invoke virtual method 'boolean com.stardust.autojs.core.loop.Timer.clearInterval(int)' on a null object reference
是因为你在使用 setInterval 和 clearInterval 时,执行环境中的定时器上下文不正确,导致 SentryTime 虽然返回了一个 ID,但在调用 clearInterval(SentryTime) 时无法找到对应的定时器实例。
这个问题在 Hamibot 中常见于 异步回调中尝试清除在外部定义的 setInterval 定时器,尤其是当 setInterval 不是由全局的 timers 模块管理时。
✅ 正确做法:使用 timers 模块来确保定时器可被清除
你需要显式使用 timers.setInterval 和 timers.clearInterval 来保证定时器生命周期受控。
修改后的代码如下:
// 文档地址 https://docs.hamibot.com/
var timers = require('timers');
var SentryTime = timers.setInterval(function () {
http.get('http://192.168.1.150:3000/api/status/' + sentryCode, {}, function (res, err) {
try {
if (err) {
console.error('监听失败!');
return;
}
let resData = res.body.json().data;
if (resData.status) {
console.log('检测到警报,停止轮询');
timers.clearInterval(SentryTime);
// 后续逻辑...
console.log('执行警报处理逻辑');
// 例如:startScript() 或其他操作
}
} catch (error) {
console.error('解析响应出错: ' + error.message);
}
});
}, 500);
🔍 原因说明
- 在 Hamibot 中,直接使用
setInterval可能会绑定到错误的执行上下文(尤其是在 Rhino 引擎下)。 timers模块是 Hamibot 提供的标准定时器管理模块,它确保了定时器可以在任意作用域中被正确创建和清除。- 你原来的
clearInterval()失败,是因为 JS 引擎找不到该 ID 对应的 Timer 实例 —— 它可能已被释放或未注册到全局管理器中。
🛠️ 补充建议
-
引入 timers 模块是最佳实践:
var timers = require('timers');所有
setInterval/setTimeout/clearInterval/clearTimeout都应通过此模块调用。 -
避免在回调中嵌套过多异步逻辑,可考虑封装成函数提升可读性。
-
检查变量作用域:确保
sentryCode已正确定义。
✅ 总结
将 setInterval 改为 timers.setInterval,并使用 timers.clearInterval 清除定时器,即可解决你的空指针异常。这是 Hamibot 环境下的标准做法。