静态块如何传播异常?
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.
之后
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.
之后