静态块如何传播异常?

How are exceptions propagated by static blocks?

static {
    MessageDigest d;
    try {
        d = java.security.MessageDigest.getInstance("MD80"); <-- MD80 is no valid algorithm
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
    hasher = d;
}

JVM 会在 class 加载到 JVM 时自动执行这些静态初始化语句。这意味着,runtimeexception 在加载时抛出异常。

现在,如果我 运行 这样的 class (通过 eclipse ),我会收到大量源自控制台静态块的异常。

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: java.security.NoSuchAlgorithmException: MD8 MessageDigest not available
    at BloomFilter.<clinit>(BloomFilter.java:86)
Caused by: java.security.NoSuchAlgorithmException: MD8 MessageDigest not available
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:142)
    at java.security.Security.getImpl(Security.java:659)
    at java.security.MessageDigest.getInstance(MessageDigest.java:129)
    at BloomFilter.<clinit>(BloomFilter.java:84)

但是,这里有疑问。此异常在 'load time' 处抛出。 它是如何在 运行 时间显示在控制台中的? 此异常是否被抛出并存储在 'load' 和 'runtime' 之间的某个位置?

基本上我想了解在静态块中抛出异常后 'loadtime and runtime' 之间会发生什么?

此异常是在运行时抛出的。没有存储异常的概念。基本上,当 class 第一次加载时,静态初始化块仅按顺序逐行执行一次,即 class 是 referred/object 被创建等

我认为加载时间是指编译时间。在编译时,编译器只会检查您的 java 代码在语法上是否正确。它不会执行任何代码。它只会编译你的代码并准备字节码,即 .class 文件给你。

没有"load time"这样的东西——只有"runtime"。当 JVM 启动时,它会确定它需要加载哪些 classes;静态初始化在需要时执行;例如在加载 class.

之后