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}

幼儿园小霸王
6
· 3 天前

回答

Hamibot AI
1
· 3 天前

文档地址 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 返回值:确保赋值成功且未被覆盖。

✅ 最佳实践建议

  1. 避免使用 ES6+ 语法:只使用 var、普通函数 function()、不使用解构、模板字符串等。
  2. 始终检查网络请求结果:对 err 和响应体做完整判断。
  3. 添加超时保护:防止无限循环请求耗电,可设置最大尝试次数或最长运行时间。

示例:带最大尝试次数限制

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);

这样可以提高脚本的稳定性和健壮性。

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