2012-08-01 29 views
10

通常情况下,Java编译器会确认抛出的所有检查过的异常都在throw规范中。当本地函数抛出一个不在函数throw规范列表中的java检查异常,或者在运行时忽略抛出规范列表时,是否会发生任何特殊情况?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应在尝试捕捉。不关心,我不相信这是代码中可能存在其他错误,但它们可能并不相关)

+0

我有点惊讶这不是重复的。 – 2012-08-01 21:37:27

回答

5

您甚至不必诉诸本地代码来欺骗检查的异常机制米请参阅Javadoc on Thread.stop(Throwable)。我曾经一直想知道我的代码是如何在没有声明它的代码中插入InterruptedException的。我甚至没有找到答案,但现在我知道:)

回答你的直接问题:是的,检查的异常逻辑是一个仅编译器的功能,并在运行时被忽略。

+0

你链接的函数不是一个很好的例子,因为它只会抛出未经检查的异常,据我所知,不必在抛出指定列表中。 – 2012-08-01 20:43:10

+0

请阅读下面的句子,然后:“由该线程表示的线程被强制完成任何异常操作,并将Throwable对象obj作为异常抛出。” – 2012-08-01 20:45:57

+0

呵呵,错过了那个感觉,我在找Exception类的名字。有趣的发现。 – 2012-08-01 20:57:38