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 都没有这样做)。

我认为您可以安全地假设 excExceptionClear 之后仍然有效。如果不是,您会注意到它,因为使用陈旧的本地引用会导致某种 JNI 错误。