Pegadinha para feras de conceito que não cai na certificação

7 respostas
Luca

Olá

1. Compilem as seguintes classes:

public class Cliente {
   public static void main (String [] args) {		
      Fornecedor f = new Fornecedor();
   }
}
public class Fornecedor {
   public Fornecedor() {}
}
]

Executem: java Cliente

Agora vem a pegadinha:

2. Modifiquem a classe Fornecedor para lançar uma Exception no construtor

public class Fornecedor {
   public Fornecedor() throws Exception {}
}

3. Compilem somente a classe Fornecedor e tornem a executar java Cliente (não dá erro).

4. Agora tentem recompilar Cliente.java e confirmem que agora aparece erro:

C:\&gtjavac Cliente.java
Cliente.java:3: unreported exception java.lang.Exception; must be caught or declared to be thrown
      Fornecedor f = new Fornecedor();
                     ^
1 error

C:\&gt

Pergunta:
Porque a execução no passo 3 não dá erro e porque a compilação do passo 4 dá erro

[]s
Luca

7 Respostas

J

Por que você compilou somente a classe Fornecedor e não a Cliente novamente… E não usou o Eclipse :smiley:

Luca

Olá

Aí mora a pegadinha…

Sem IDEs para não recompilar o que não é para recompilar antes da hora.

Dica para os mais perdidos: Experimentem fazer javap -c Fornecedor antes de modificar e depois de compilada com a Exception

[]s
Luca

fmeyer

seguinte,

Quando voce compila a classe com um metodo que pode gerar uma exception nao quer dizer que aquele metodo vai gerar uma exception …

ou seja essa checagem só é feita em tempo de compilacao no java e nao em tempo de execucao …

se voce gerar uma exception no construtor desta forma

public class fornecedor {
    public fornecedor() throws Exception {
	    throw new Exception();
    }
 }

O erro que se da em tempo de execucao aparecera

ai sim ele vai reclamar …

pcalcado

lazy binding?

grprado

http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#3129

A especificação da JVM deixa isso em aberto mesmo.

Um artigo legal nessa linha é o Breaking Java exception handling rules is easy

Luca

Olá

O que o Scotty disse faz algum sentido mas o grprado foi em cima da ferida!

Pois é, o negócio parece estranho mas é assim mesmo. O compilador checa que Fornecedor lança uma Exception e obriga o tratamento em Cliente.

Porém a JVM não tem esta informação de que o construtor de Fornecedor lança uma Exception. Assim o resultado de javap antes e depois de incluir o throws Exception é o mesmo.

Estou tentando entender a tal de cglib (mal documentada) e acabei nesta coisa esquisita na compatibilidade binária do Java.

[]s
Luca

Luca

Olá

É exatamente isto, mas como você respondeu mais coisa, acabei não me fixando nesta sua frase.

[]s
Luca

Criado 21 de agosto de 2006
Ultima resposta 21 de ago. de 2006
Respostas 7
Participantes 5