Eu andei vendo isso em códigos de terceiros em Java e .NET C#, e não entedi como funciona e para que serve, os atributos static eu entendo, fazem parte da classe e não de uma instancia, mas esse codigo eu não entendi, alguém pode me explicar ?
e ja ia esquecendo o bloco de inicialização estatico é executado sempre antes de todos os construtores, e se um bloco de inicialização lança uma excepção verificada, então ai todos os construtores devem lançar esta execpção,
maior_abandonado
o que o sulito disse está correto, só complementando…
na ordem é executado da seguinte forma:
primeiro os blocos estaticos das classes mães, avós, etc,começando pela mais acima até chegar a classe sendo usada.
depois disso os blocos não estaticos.
depois os construtores.
os blocos estaticos são executados uma unica vez quando a classe vai para a memoria, enquanto que os não estaticos são executados cada vez que você instancia a classe.
bom, se não me engano é isso.
S
sulito
è mesmo isso não te enganaste, a ordem é esta.
pablouu
sulito,
poderia explicar essa parte : e se um bloco de inicialização lança uma excepção verificada, então ai todos os construtores devem lançar esta execpção.
talvez com algum exemplo.
também to estudando pra scjp.
S
sulito
É o seguinte, vou ser o mais sincero possivel, eu li isso num livro e ficou o conceito na cabeça, mas nunca testei excepções em blocos estatico , mas prometo que vou fazer uns testes e ainda amanha eu tenho uma exemplo montado, porque eu tambem estou a estudar para o scjp e não quero e nem vou deixar passar nenhuma duvida :idea: .
e se eu não encontrar um exemplo no livro, vamos enviar um email para a editora e o autor, para explicarem melhor
dipeloco
Caso um bloco static lance um exception … ela será encpsulada em uma java.lang.ExceptionInInitializerError …
Marky.Vasconcelos
E é dai que saem as ExceptionInInitializerError que são tão dificeis de se diagnosticar.
A não ser que o código seja seu.
D
daniel-6-strings
Entendi e vou realizar alguns testes e debugar para ver a execução, mas existe blocos não estaticos ?? como seria a sintaxe ??
Valew.
D
daniel-6-strings
Eu fiz assim por intuição e funcionou, esta correto somente colocar as chaves no bloco nao-estatico ? ( linha 14 )
STATIC RUN - MyBlockTest
STATIC RUN - MyBlockTestChildren
NON-STATIC RUN - MyBlockTest
CONSTRUCTOR - MyBlockTest
NON-STATIC RUN - MyBlockTestChildren
CONSTRUCTOR - MyBlockTestChildren
NON-STATIC RUN - MyBlockTest
CONSTRUCTOR - MyBlockTest
NON-STATIC RUN - MyBlockTestChildren
CONSTRUCTOR - MyBlockTestChildren
Ele pasou pelo bloco estatico da super classe e depois da subclasse uma vez na criação da primeira instancia , e depois ele passa pelo bloco nao-estatico e depois pelo construtor toda vez que instancio um objeto da classe.
Valews.
S
sulito
O pessoal todo perdeu o foco da conversa explicar como se usa os blocos de inicialização e dar exemplo ja esta mais que resolvido , mas agora surgiu outro problema que me fez passar a noite em claro :roll: :? , eu li num livro o seguinte:
mas vou postar exactamente como esta no livro
Um bloco de inicialização pode lançar uma exeção verificada somente se todos os construtores das classes declararem lançar a mesma execeção
o problema é que o livro tem esta frase mas não tem exemplo e dai que eu quero testar para ver se isso é veridico, e desde ontem que eu tento lançar uma execção num bloco de inicialização e sem sucesso. precisamos de um exemplo que funcione para esclarecer isso, e ou o livro esta errado ou é problema da tradução do livro, porque o original deste livro é em ingles
os dados do livro:
TITULO: A linguagem de programação java (quarta edição)
autores: Ken Arnold , James Gosling, David Holmes
editora:bookman
tradução: MARIA LUCIA BLANCK LISBOA
capa:
a pagina onde tirei a frase foi a pagina 73 no tema 2.5.2-blocos de inicialização
e principalmente para o pessoal que esta a estudar para scjp que é o meu caso devemos descobrir o que se passa :idea:
devemos conseguir um exemplo que mostra uma exeção lançada por um bloco de inicialização, ou então o pessoal que escreveu ou traduziu o livro se enganou
e mais uma dica o livro não se referia a [b]
Membro desde: 21/05/2007 12:14:11
Mensagens: 72
Offline
Caso um bloco static lance um exception … ela será encpsulada em uma java.lang.ExceptionInInitializerError … [/b] axo eu
maior_abandonado
sulito:
Um bloco de inicialização pode lançar uma exeção verificada somente se todos os construtores das classes declararem lançar a mesma execeção
o problema é que o livro tem esta frase mas não tem exemplo e dai que eu quero testar para ver se isso é veridico, e desde ontem que eu tento lançar uma execção num bloco de inicialização e sem sucesso. precisamos de um exemplo que funcione para esclarecer isso, e ou o livro esta errado ou é problema da tradução do livro, porque o original deste livro é em ingles
veja o exemplo dessa classe abaixo:
packagepacote;importjava.sql.SQLException;publicclassClasse{publicstaticintnumero=0;static{System.out.println("bloco estatico");}{System.out.println("\nbloco comum");numero++;if(numero%2==1){thrownewSQLException("a cada vez impar que instanciar o objeto vai dar problema");}}publicClasse()throwsSQLException{System.out.println(numero);}publicClasse(Stringpalavra)throwsSQLException{System.out.println(palavra);}publicClasse(intparametroNumero)throwsSQLException{System.out.println(parametroNumero);}publicstaticvoidmain(String[]args){for(inti=0;i<10;i++){try{newClasse();}catch(Exceptione){System.out.println("mensagem da exceção: "+e.getMessage());}}}}
se você tirar o throws de qualquer um dos construtores a classe simplesmente não compila, conforme o livro que você disse fala, então não é erro de tradução, esta correto isso mesmo, se um bloco lançar exceção, o construtor precisa declara-la.
Lembrando que exceção não verificada são as filhas, netas etc, de RuntimeException, as que tiverem na arvore de herança dela, estas podem ser lançadas, mas se você lançar uma que seja verificada (não filha de RuntimeException), precisará dar o throws nos construtores, se você mudar a exceção lançada no bloco da classe que eu postei para IllegalArgumentException, ai ja vai compilar mesmo tirando a declaração da exceção no construtor…
eu também tinha duvida quanto a isso, então resolvi testar…rs
S
sulito
calminha ai irmão :? :idea: , assim não vale não,
deves por uma excepção verificada no construtor ( ex: Exception) , e o SQLException é verificada tens toda a razão, mas nos exemplos que eu utilizava eu tentava com o Exception e não funcionava tipo:
publicclasserro{inta;{thrownewException("aqui devia dar para aceitar isso");}publicerro()throwsException{a=33;}publicerro(inta)throwsException{this.a=a;}}
isto tambem devia funcionar mas não funciona, com o sqlexception que usaste funciona lindamente com com o exception nao funciona, por isso a duvida ainda continua, porque eu tenho tentando com o exception e nada desde ontem
D
daniel-6-strings
Agora embassou. .!! rs, mas estamos aqui para aprender.
Eu fiz os testes no Eclipse ( utilizo a jdk1.6.0_12 ):
No bloco estatico não consegui lançar uma Exception, a não ser que eu colocasse num bloco try:
/* * STATIC BLOCK*/static{System.out.println("STATIC RUN - MyBlockTest");try{thrownewException();}catch(Exceptione){e.printStackTrace();}}
No bloco não estático, só consegui lancar a excecao se colocar um condicional ( linha 07 ) e colocar a clausula throws nos construtores:
calminha ai irmão :? :idea: , assim não vale não,
deves por uma excepção verificada no construtor ( ex: Exception) , e o SQLException é verificada tens toda a razão, mas nos exemplos que eu utilizava eu tentava com o Exception e não funcionava tipo:
publicclasserro{inta;{thrownewException("aqui devia dar para aceitar isso");}publicerro()throwsException{a=33;}publicerro(inta)throwsException{this.a=a;}}
isto tambem devia funcionar mas não funciona, com o sqlexception que usaste funciona lindamente com com o exception nao funciona, por isso a duvida ainda continua, porque eu tenho tentando com o exception e nada desde ontem
Compilei e rodei usando o jdk 1.5.0_22, compilou e rodou tranquilamente. Veja se o teu erro não está em quem está instanciando essa classe.
S
sulito
Compilei e rodei usando o jdk 1.5.0_22, compilou e rodou tranquilamente. Veja se o teu erro não está em quem está instanciando essa classe.
eu nem instanciei apenas compilei e deu erro. o stracktrace é
C:\erro.java:4: initializer must be able to complete normally
{
^
1 error
agora vamos fazer o seguinte os que testaram e compilou dizem que compilou e os que não compilou dizem que não, e vamos ver quantos compilou e quantos não compilou
S
sulito
mas pondo desta forma compilou e o livro esta certo :) :D
publicclasserro{inta;{if(true)thrownewException("aqui devia dar para aceitar isso");}publicerro()throwsException{a=33;}publicerro(inta)throwsException{this.a=a;}}
talvez o java 6 tenha algum tipo de trava, onde ele não irá compilar quando identificar que a exceção sempre irá ocorrer… coisa que talvez o java 1.5 não deve fazer (de acordo com o relato do Bruno)…
algo semelhante a quando você fazer algo assim:
return 12;
x = 20;//da um erro dizendo que essa linha nunca será alcançada.
claro que isso é só um chute…não posso te afirmar isso com certeza…
mas se isso for o que estou “chutando” mesmo, ja é uma particularidade dessa versão do compilador, na especificação da linguagem, o que é referente aos blocos de código, é aquilo do construtor ter que declarar a exceção mesmo mesmo…
S
sulito
maior_abandonado:
talvez o java 6 tenha algum tipo de trava, onde ele não irá compilar quando identificar que a exceção sempre irá ocorrer… coisa que talvez o java 1.5 não deve fazer (de acordo com o relato do Bruno)…
algo semelhante a quando você fazer algo assim:
return 12;
x = 20;//da um erro dizendo que essa linha nunca será alcançada.
claro que isso é só um chute…não posso te afirmar isso com certeza…
mas se isso for o que estou “chutando” mesmo, ja é uma particularidade dessa versão do compilador, na especificação da linguagem, o que é referente aos blocos de código, é aquilo do construtor ter que declarar a exceção mesmo mesmo…
quanto ao que disseste eu tambem acho que tens toda a razão, porque até ja notei jdk6 e 7 que eu uso não deixa mesmo por codigo assim
return2;x++;
parece que o compilador rejeita para não ter codigo desnessecario que nunca ira correr.
mas estou a baixar o jdk 5 ( custou encontrar visto que é antigo) mas quando eu instalar vou testar o codigo e se funcionar então o tema estara resolvido