【问题标题】:Java checked exception not in the function's throw specification?Java 检查异常不在函数的抛出规范中?
【发布时间】:2012-07-30 18:44:09
【问题描述】:

通常,Java 编译器会确认所有抛出的检查异常都在 throw 规范中。当一个原生函数抛出一个不在函数抛出规范列表中的 java 检查异常时会发生什么特殊情况,或者抛出规范列表在运行时被简单地忽略了吗?

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 中。不要在意,我不认为它与问题有关。代码中可能还有其他错误,但它们是可能也不相关。)

【问题讨论】:

  • 我有点惊讶这不是重复的。

标签: java exception java-native-interface throws


【解决方案1】:

您甚至不必求助于本机代码来欺骗检查异常机制。请参阅Javadoc on Thread.stop(Throwable)。我曾经一整天都在想,我的代码是如何在没有声明它的代码中间抛出InterruptedException 的。那时我什至没有找到答案,但现在我知道了:)

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

【讨论】:

  • 您链接的函数不是一个很好的例子,因为据我所知,它只抛出未经检查的异常,而不必在抛出规范列表中。
  • 阅读下面的句子,然后:“这个线程所代表的线程被强制完成它正在做的任何异常,并将Throwable对象obj作为异常抛出。”
  • 哦,错过了那句话,我正在寻找异常类名称。有趣的发现。
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 2018-10-17
相关资源
最近更新 更多