2015-03-08 3 views
3
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 автоматически выполнит эти статические инструкции инициализации, когда класс загружается в JVM. То есть, runtimeexception Исключение было брошено во время загрузки.Каковы исключения, распространяемые статическими блоками?

Теперь, если я запускаю такой класс (через 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) 

Но, вот сомнение. Это исключение было выбрано в «время загрузки». Как это отображалось во время работы в консоли? Было ли это исключение брошено и хранилось где-то между «загрузкой» и «временем выполнения»?

В основном я ищу, чтобы понять, что происходит между «временем загрузки и временем выполнения», когда исключение было выбрано в статическом блоке?

+1

Нет «времени загрузки». Классы загружаются и инициализируются, лениво, во время выполнения. –

+0

Я ценю быстрое возвращение :-) – GhostCat

ответ

2

Нет такой вещи, как «время загрузки» - есть только «время выполнения». Когда JVM запускается, он определяет, какие классы он должен загружать; статические инициализации выполняются всякий раз, когда они должны быть; например, сразу после загрузки класса.

2

Это исключение было брошено во время выполнения. Концепции хранения исключения нет. В основном статический блок инициализации выполняется только последовательно последовательно, когда класс загружается в первый раз, когда класс передается/создается объект и т. Д.

Я думаю, что при загрузке вы имеете в виду время компиляции. Во время компиляции компилятор просто проверит, является ли ваш Java-код синтаксически правильным или нет. Он не будет выполнять какой-либо код. Он просто скомпилирует ваш код и подготовит для вас байт-код, то есть файл .class.

Смежные вопросы