在JNI下只能捕捉Throwable类的异常,如果捕捉Exception类的异常是进不到catch方法里的。
try { logger.info("dll文件读取成功"); } catch (Throwable e) { // JNI只能捕捉到Throwable异常 e.printStackTrace(); logger.error("dll文件读取失败"); }
原因猜测可能是因为JNI下出现异常是委托给Error类(用来处理程序运行环境方面的异常,比如,虚拟机错误、装载错误和连接错误,这类异常主要是和硬件有关的,而不是由程序本身抛出的),而Throwable类是Error类的父类(Java语言要求java程序中(无论是谁写的代码)所有抛出(throw)的异常都必须是从Throwable派生而来),也就能往下兼容而捕捉到异常。
因此如果发现在JNI下捕获异常失败,只要将捕捉的Exception类换成Throwable类(或Error类)即可。
"世事无常,但我依然爱你。"