我正在尝试使用 LuaJava 从 Java 调用一个简单的 Lua 函数。
计算.lua:
function foo(n) return n*2 end
这就是 calc.lua 中的全部内容以及来自命令行工作的后续调用。
这是总是有错误的调用:
L.getGlobal("foo");
L.pushNumber(8.0);
int retCode=L.pcall(1, 1,-2); // retCode value is always 5 pcall(numArgs,numRet,errHandler)
String s = L.toString(-1); // s= "Error in Error Handling Code"
我也尝试过
L.删除(-2);
L.插入(-2);
不知道为什么它会给出任何错误或者错误是什么。也许我没有正确设置错误处理程序?那么它不拨打电话吗?加载后,我从控制台尝试并可以运行 print(foo(5)) 按预期返回 10 。
更新:看起来我需要在堆栈上提供一个错误处理程序。这种错误处理程序的签名是什么以及如何将其放置在堆栈上的某个点上。谢谢
这取自 Lua 参考手册——在C API 部分它是这样描述 pcall 的:
当您使用 lua_call 调用函数时,被调用函数内的任何错误都会向上传播(使用 longjmp)。如果你需要处理错误,那么你应该使用 lua_pcall:
int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
...
如果errfunc为0,则返回的错误信息正是
原始错误消息。否则,errfunc 给出堆栈索引
错误处理函数。 (在当前的实现中,该索引
不能是伪索引。)如果出现运行时错误,该函数
将被调用并显示错误消息,其返回值将是
lua_pcall 返回的消息
因此,假设 LuaJava 的 API 只是镜像 C API,那么只需传递 0 即可表示没有特殊的 errfunc。像这样的东西应该有效:
int retCode = L.pcall(1, 1, 0);
String errstr = retCode ? L.toString(-1) : "";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)