通常,Java编译器确认抛出的所有检查的异常都在throw规范中.当本机函数抛出不在函数throw规范列表中的java检查异常,或者是在运行时简单忽略的throw规范列表时是否会发生什么特别的事情?
C
void function(JNIEnv * env,jclass jc) { jclass newExcCls = env->FindClass("java/lang/NullPointerException"); env->ThrowNew(newExcCls,"ERROR"); }
Java的
public class Tester { static { System.loadLibrary( "MyLibrary" ); } private static native void function(); public static void main(String [ ] args) { try { function(); } catch( Exception e ) { //is it caught? Or what happens? e.printStackTrace(); } } }
(C函数名称可能会被破坏,而且loadLibrary应该是一个try catch,不要在意,我不认为这与问题有关,代码中可能还有其他错误,但是它们可能不相关无论是.)
解决方法
你甚至不用诉诸本地代码来愚弄被检查的异常机制.看到
Javadoc on Thread.stop(Throwable).我一直在想,整个一天,我的代码如何在没有声明的代码中间抛出一个InterruptedException.我甚至没有找到答案,但现在我知道:)
回答你的直接问题:是的,检查的异常逻辑是一个仅编译器的功能,在运行时被忽略.