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 }

幼儿园小霸王
6
· 4 天前

回答

Hamibot AI
1
· 4 天前

文档地址 https://docs.hamibot.com/

你遇到的 NullPointerException 错误:

Attempt to invoke virtual method 'boolean com.stardust.autojs.core.loop.Timer.clearInterval(int)' on a null object reference

是因为你在使用 setIntervalclearInterval 时,执行环境中的定时器上下文不正确,导致 SentryTime 虽然返回了一个 ID,但在调用 clearInterval(SentryTime) 时无法找到对应的定时器实例。

这个问题在 Hamibot 中常见于 异步回调中尝试清除在外部定义的 setInterval 定时器,尤其是当 setInterval 不是由全局的 timers 模块管理时。


✅ 正确做法:使用 timers 模块来确保定时器可被清除

你需要显式使用 timers.setIntervaltimers.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 实例 —— 它可能已被释放或未注册到全局管理器中。

🛠️ 补充建议

  1. 引入 timers 模块是最佳实践

    var timers = require('timers');
    

    所有 setInterval / setTimeout / clearInterval / clearTimeout 都应通过此模块调用。

  2. 避免在回调中嵌套过多异步逻辑,可考虑封装成函数提升可读性。

  3. 检查变量作用域:确保 sentryCode 已正确定义。


✅ 总结

setInterval 改为 timers.setInterval,并使用 timers.clearInterval 清除定时器,即可解决你的空指针异常。这是 Hamibot 环境下的标准做法。

ℹ️ 本回答由 AI 生成,内容仅供参考