调用ExceptionClear()后,ExceptionOccurred()返回的异常对象是否仍有效?
结论
先调用ExceptionClear()后,此前获取的异常对象exc仍然有效,可以正常使用。
原理说明
- JNI规范定义:
ExceptionOccurred()返回的是当前线程待处理异常的本地引用,该引用本身属于GC根,只要未主动释放就会阻止对应对象被GC回收。 ExceptionClear()的作用仅为清除当前线程的「待处理异常状态标记」,不会释放你已经持有的异常对象本地引用,也不会修改引用指向的对象内容。
额外提示
你的实现逻辑符合JNI最佳实践:绝大多数JNI函数在存在待处理异常时调用都会触发未定义行为,先清理异常状态再调用FindClass、GetMethodID这类函数的写法是正确的。
建议在使用完exc对象后,主动调用env->DeleteLocalRef(exc)释放该本地引用,避免高频调用场景下出现本地引用表溢出问题。
内容的提问来源于stack exchange,提问作者Edward Falk
相关产品推荐
相关产品推荐

