gpt4 book ai didi

Java UncaughtExceptionHandler 使用 JNI 没有任何异常

转载 作者:可可西里 更新时间:2023-11-01 18:39:28 24 4
gpt4 key购买 nike

我有一个运行一系列任务的 Java 库。我使用以下方法注册了一个默认的未捕获异常处理程序:

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

UncaughtExceptionHandler实现了UncaughtExceptionHandler,只在STDERR中记录错误信息。

我的 Java 库是通过 JNI 从 C++ 代码调用的,JNI 使用 ExceptionCheck() 调用它,并在 C++ 中将错误记录为 FATAL。

问题是:

在运行时,当我的 Java 代码中发生 RuntimeException(或任何其他未捕获的异常)时,错误会在 C++ 中捕获,而不是我的 JavaUncaughtExceptionHandler 注册为线程默认的未捕获异常处理程序。

  1. 这是异常(exception)行为吗?
  2. 什么时候调用 DefaultUncaughtExceptionHandler?我知道在线程关闭之前,但特别是在 JNI 情况下。是在返回到 C++ 之前还是在 C++ 代码完成之后调用)。我认为这与JNI中的线程管理有关,请分享任何相关信息。
  3. 我是否可以在我的 Java 代码中捕获所有异常(除了放置 try/catch block 之外的其他替代方法)

非常感谢。

最佳答案

这听起来像是您在谈论 Java 调用 API(即,您是从 C++ 程序中调用 Java 方法,而不是简单的 JNI,后者的调用是相反的。)

我不是专家,但我使用过 Java 调用 API。

据我所知,只有在 Java 线程的 run() 方法抛出异常时才会调用未捕获的异常处理程序。但是在由 C/C++ 代码创建的线程中没有任何run() 方法。

我写的是 C,而不是 C++,所以我对 Java 的调用看起来都像

jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...);

当从 C 调用时,它总是返回,但在您使用 return_value 之前,您必须检查该方法是否正常返回或抛出异常。

如果它抛出异常,那么异常就没有办法“未被捕获”,如果 C 代码没有调用 (*env)->ExceptionClear(env)(即,如果C 代码没有“捕获”异常),那么我不记得发生了什么,但我认为这不好。

关于Java UncaughtExceptionHandler 使用 JNI 没有任何异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39127512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com