[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Exceptions no inicializador estático



Oi.

Na aula passada surgiu uma dúvida sobre o que acontece se uma exceção
é atirada de um inicializador estático. A specificação da linguagem
(§8.7 http://tinyurl.com/7dmrd) diz "It is a compile-time error for a
static initializer to be able to complete abruptly (§14.1, §15.6) with
a checked exception (§11.2). It is a compile-time error if a static
initializer cannot complete normally (§14.21).". Então para poder
levantar uma exceção de um inicializador estático é preciso que a
exceção seja unchecked (descenda de java.lang.RuntimeException) e que
o compilador não consiga determinar que o bloco não termina
normalmente. Isso funciona, por exemplo:
static { if (true) throw new RuntimeException; }

Em outro ponto da especificação (§11.3 http://tinyurl.com/o5kac) é
definido que o responsável por tratar uma exceção é o "caller" do
método que atirou a exceção e que no caso de inicializadores estáticos
esse caller é "the expression that used the class or interface so as
to cause it to be initialized.". Testando, vemos que a exceção que
chega ao statement que provocou o carregamento da classe é na verdade
um Error: java.lang.ExceptionInInitializerError, uma subclasse de
LinkageError.

Se esse Throwable é tratado (o que não é recomendado) e o código tenta
posteriormente usar a mesma classe que levantou a exceção, um
java.lang.NoClassDefFoundError é atirado neste ponto.

t+
--
Rafael de F. Ferreira.