当前位置: 首页 > 面试题库 >

在JNI代码中引发异常的最佳方法?

伊羽
2023-03-14
问题内容

我想要一种一致且简单的方法来在JNI代码中引发异常;处理链式异常的东西(隐式地来自env->
ExceptionOccurred方法,或者由参数显式表示,无论哪种方式都不错),并且每次执行此操作时都无需查找构造函数。尽管我可以根据需要从C
++进行翻译,但上述所有内容最好都用C语言编写。

SO上是否有人可以分享这样的东西?


问题答案:

我们只是为要抛出的每种异常类型编写实用程序方法。这里有些例子:

jint throwNoClassDefError( JNIEnv *env, char *message )
{
    jclass exClass;
    char *className = "java/lang/NoClassDefFoundError";

    exClass = (*env)->FindClass( env, className);
    if (exClass == NULL) {
        return throwNoClassDefError( env, className );
    }

    return (*env)->ThrowNew( env, exClass, message );
}

jint throwNoSuchMethodError(
        JNIEnv *env, char *className, char *methodName, char *signature )
{

    jclass exClass;
    char *exClassName = "java/lang/NoSuchMethodError" ;
    LPTSTR msgBuf;
    jint retCode;
    size_t nMallocSize;

    exClass = (*env)->FindClass( env, exClassName );
    if ( exClass == NULL ) {
        return throwNoClassDefError( env, exClassName );
    }

    nMallocSize = strlen(className) 
            + strlen(methodName)
            + strlen(signature) + 8;

    msgBuf = malloc( nMallocSize );
    if ( msgBuf == NULL ) {
        return throwOutOfMemoryError
                ( env, "throwNoSuchMethodError: allocating msgBuf" );
    }
    memset( msgBuf, 0, nMallocSize );

    strcpy( msgBuf, className );
    strcat( msgBuf, "." );
    strcat( msgBuf, methodName );
    strcat( msgBuf, "." );
    strcat( msgBuf, signature );

    retCode = (*env)->ThrowNew( env, exClass, msgBuf );
    free ( msgBuf );
    return retCode;
}

jint throwNoSuchFieldError( JNIEnv *env, char *message )
{
    jclass exClass;
    char *className = "java/lang/NoSuchFieldError" ;

    exClass = (*env)->FindClass( env, className );
    if ( exClass == NULL ) {
        return throwNoClassDefError( env, className );
    }

    return (*env)->ThrowNew( env, exClass, message );
}

jint throwOutOfMemoryError( JNIEnv *env, char *message )
{
    jclass exClass;
    char *className = "java/lang/OutOfMemoryError" ;

    exClass = (*env)->FindClass( env, className );
    if ( exClass == NULL ) {
        return throwNoClassDefError( env, className );
    }

    return (*env)->ThrowNew( env, exClass, message );
}

这样,很容易找到它们,您的代码完成编辑器将帮助您键入它们,并且您可以传递简单的参数。

我确信您可以扩展它来处理链式异常或其他更复杂的方法。这足以满足我们的需求。



 类似资料:
  • 我有一个rest服务,它将抛出一个异常,我想知道什么将是最好的方式来处理这一点。 我想知道这是rest服务中处理异常的正确方式吗? 我在用泽西。

  • 问题内容: 我正在编写一个Java程序,该程序读取一个单词文件。程序至关重要地依赖于此文件,因此,无论出于何种原因,在读取文件时都出现IOException,我确实希望程序结束。 结束程序的最佳方法是什么?我认为我被迫将文件读取包围在try / catch块中,因此我应该在catch中添加一个内部吗?例如,我应该做以下事情吗? 问题答案: 如果让异常一直传播到方法,程序将结束。无需调用,只需允许异

  • 我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。 我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在

  • 我正在使用核心java开发一个测试框架。在我的应用程序中,我有一个父方法,它调用十个不同的子方法,每个方法都可以抛出自己的异常。要求是提供有关父方法执行的详细日志信息,其中包含执行该方法所用的总时间、执行每个子方法所用的时间、记录任何异常等信息。为此,我使用了多个try-catch-finally块。 我的问题是,如果其中一个子方法抛出异常,跳过剩余子方法执行的最佳方法是什么?例如:如果方法4抛出

  • 我有一个可为空的变量,通过它我可以通过获取(同样为空)。 我想做的是

  • 我的类有一个名为的私有对象,其构造函数需要另一个类的实例。 如果失败,如何引发异常?