相关疑难解决方法(0)

Java不可达catch块编译器错误

为什么在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)

有任何想法吗?

java scjp

16
推荐指数
2
解决办法
4万
查看次数

在Android上用例外替换JNI崩溃

我开发了一个使用本机C库的Android应用程序.我可以用JNI成功编译整个东西,一切顺利.

但是,偶尔本机C库崩溃(最常见的是SIGSEGV).反过来,这会导致我的应用程序在没有任何有意义的用户通知的情况下崩溃.我想要实现的目标如下:

  1. 使用信号处理程序(sigaction)捕获本机代码中的信号以防止随机崩溃
  2. 在Java可以捕获的C库中抛出异常
  3. 在Java中捕获异常,为用户生成有意义的警告消息并使应用程序保持运行

如果这对你有用 - 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)

c java android signals android-ndk

7
推荐指数
1
解决办法
804
查看次数

c代码可以引发java异常吗?

可能重复:
在JNI代码中抛出异常的最佳方法是什么?

我看到系统#arraycopy可能会引发ArrayStoreExceptionIndexOutOfBoundsException等等
,但我也看到了系统#arraycopy是一种使用native方法,这意味着C代码,对不对?
那么C代码怎么可能抛出任何这些java异常呢?

c java native exception

5
推荐指数
1
解决办法
248
查看次数

我应该从应用程序本机库(通过JNI使用)抛出java.lang.OutOfMemoryError吗?

我正在设计一个解决方案,其中包括一个C++库和几个通过JNI使用该库的Java应用程序.

C++库大量分配本机内存.当分配失败时,可以从C++代码中检测到.分配失败应报告给Java代码,抛出一些东西.

考虑了两个选项:

  1. 从我的C++代码中抛出java.lang.OutOfMemoryError
  2. 添加mylibrary.MyLibraryOutOfMemoryError(扩展java.lang.RuntimeException或java.lang.Error),然后抛出它

什么是正确的选择,为什么?

java java-native-interface out-of-memory

3
推荐指数
1
解决办法
1943
查看次数