为什么在Java中我们可以捕获一个Exception即使它没有被抛出,但我们无法捕获它的子类(除了"unchecked" RuntimeException和它的子类).示例代码:
class Test {
public static void main(String[] args) {
try {
// do nothing
} catch (Exception e) {
// OK
}
try {
// do nothing
} catch (IOException e) {
// COMPILER ERROR: Unreachable catch block for IOException.
//This exception is never thrown from the try statement body
}
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我开发了一个使用本机C库的Android应用程序.我可以用JNI成功编译整个东西,一切顺利.
但是,偶尔本机C库崩溃(最常见的是SIGSEGV).反过来,这会导致我的应用程序在没有任何有意义的用户通知的情况下崩溃.我想要实现的目标如下:
如果这对你有用 - JNI代码在一个单独的线程中运行(在AsyncTask中更精确).
我已经检查了http://blog.httrack.com/blog/2013/08/23/catching-posix-signals-on-android/和https://github.com/xroche/coffeecatch 但我无法编译.
遵循Best方法在JNI代码中抛出异常的建议?而如何捕捉JNI崩溃与使用信号处理基础的机制在Java异常和https://www.developer.com/java/data/exception-handling-in-jni.html 我进行下面的步骤:
在我的本机代码中,我添加了以下函数(据我所知)设置了一个信号处理程序:
void initializeSignalHandler(JNIEnv* env){
int watched_signals[] = { SIGABRT, SIGILL, SIGSEGV, SIGINT, SIGKILL }; // 6, 4, 11, 2, 9
struct sigaction sighandler;
memset(&sighandler, 0, sizeof(sighandler));
sighandler.sa_sigaction = &sighandler_func;
sighandler.sa_mask = 0;
sighandler.sa_flags = SA_SIGINFO | SA_ONSTACK;
for(int ii=0; ii<5; ii++){
int signal = watched_signals[ii];
sigaction(signal, &sighandler, NULL);
}
env = env;
}
Run Code Online (Sandbox Code Playgroud)
我处理这些信号的函数如下所示:
void sighandler_func(int sig, siginfo_t* …Run Code Online (Sandbox Code Playgroud) 可能重复:
在JNI代码中抛出异常的最佳方法是什么?
我看到系统#arraycopy可能会引发ArrayStoreException或IndexOutOfBoundsException等等
,但我也看到了系统#arraycopy是一种使用native方法,这意味着C代码,对不对?
那么C代码怎么可能抛出任何这些java异常呢?
我正在设计一个解决方案,其中包括一个C++库和几个通过JNI使用该库的Java应用程序.
C++库大量分配本机内存.当分配失败时,可以从C++代码中检测到.分配失败应报告给Java代码,抛出一些东西.
考虑了两个选项:
什么是正确的选择,为什么?