You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用ExceptionClear()后,ExceptionOccurred()返回的异常对象是否仍有效?

结论

先调用ExceptionClear()后,此前获取的异常对象exc仍然有效,可以正常使用。

原理说明

  • JNI规范定义:ExceptionOccurred() 返回的是当前线程待处理异常的本地引用,该引用本身属于GC根,只要未主动释放就会阻止对应对象被GC回收。
  • ExceptionClear()的作用仅为清除当前线程的「待处理异常状态标记」,不会释放你已经持有的异常对象本地引用,也不会修改引用指向的对象内容。

额外提示

你的实现逻辑符合JNI最佳实践:绝大多数JNI函数在存在待处理异常时调用都会触发未定义行为,先清理异常状态再调用FindClass、GetMethodID这类函数的写法是正确的。
建议在使用完exc对象后,主动调用env->DeleteLocalRef(exc)释放该本地引用,避免高频调用场景下出现本地引用表溢出问题。

内容的提问来源于stack exchange,提问作者Edward Falk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:06:01