ExceptionOccurred() 返回的异常对象在ExceptionClear() 之后是否仍然有效?
Is the exception object returned by ExceptionOccurred() still valid after ExceptionClear()?
在我的 C++ 代码中,我想测试 Java 异常,获取有关它的信息,并在本地处理它:
jobject exc = env->ExceptionOccurred();
if (exc) {
env->ExceptionClear();
jclass javaLang = env->FindClass("java/lang/Object");
jmethodID j_toString = env->GetMethodID(javaLang, "toString", "()Ljava/lang/String;");
auto s = (jstring)(env->CallObjectMethod(exc, j_toString));
...
}
我在靠近顶部的地方调用了 ExceptionClear()
,因为如果我不调用 FindClass()
将导致“JNI FindClass 调用时出现未决异常”错误。但是如果我这样做,异常对象是否仍然有效?
ExceptionOccurred
为您提供异常对象的本地引用。所以它不会受到 ExceptionClear
的影响,除非 ExceptionClear
也清除了本地引用 table,这很奇怪(FWIW ART 和 Dalvik 都没有这样做)。
我认为您可以安全地假设 exc
在 ExceptionClear
之后仍然有效。如果不是,您会注意到它,因为使用陈旧的本地引用会导致某种 JNI 错误。
在我的 C++ 代码中,我想测试 Java 异常,获取有关它的信息,并在本地处理它:
jobject exc = env->ExceptionOccurred();
if (exc) {
env->ExceptionClear();
jclass javaLang = env->FindClass("java/lang/Object");
jmethodID j_toString = env->GetMethodID(javaLang, "toString", "()Ljava/lang/String;");
auto s = (jstring)(env->CallObjectMethod(exc, j_toString));
...
}
我在靠近顶部的地方调用了 ExceptionClear()
,因为如果我不调用 FindClass()
将导致“JNI FindClass 调用时出现未决异常”错误。但是如果我这样做,异常对象是否仍然有效?
ExceptionOccurred
为您提供异常对象的本地引用。所以它不会受到 ExceptionClear
的影响,除非 ExceptionClear
也清除了本地引用 table,这很奇怪(FWIW ART 和 Dalvik 都没有这样做)。
我认为您可以安全地假设 exc
在 ExceptionClear
之后仍然有效。如果不是,您会注意到它,因为使用陈旧的本地引用会导致某种 JNI 错误。