Questão Fácil

O que acontece ao compilar e executar?

package teste;
public class Teste extends Thread { 
  public static void main(String[] args) {
    Teste t = new Teste();
    t.start();
  }
  
  public void run() {
    int i;
    try {
      i = 2000;
      sleep(i);
    }
    catch(InterruptedException e) {}
    
    System.out.println("O segmento dormiu " + (i/1000) + " segundos!");
  }
} 

A. Imprime O segmento dormiu 2 segundos
B. Erro em tempo de compilação
C. Erro em tempo de execução

opção ‘A’

tambem vou na letra A!

Tudo indica q é letra A.

eu acho :oops: q dá ERRO EM COMPILAÇÃO, i não é inicializado, pra todo efeito, i n pode correr o risco de não ser inicializada antes de usar(ler). Sei lá, vou de B :oops:

variaveis locais só podem ser usadas depois de iniciadas, entaum eh a letra A!

Poutssssssss … caraiooo… eh isso mesmo … erro de compilacao !!! 8O

Cara, me explique isso direito na moral !!! hehehehehehehe

Pelo que eu saiba não tem como a variavel local i não ser inicializada.
Ela entra no try{ e não tem nada q lance excecao antes de i ser inicializada !! }

se sleep(xxxxxxx) viesse antes da declaracao de i poderia até ser!

Alguém explica :?: :?: :idea: :idea:

cara o i ta dentro do try e é declarado antes, por isso ele tem q ser inicializado antes

é isso … , o q vc falou todo mundo já soube que é por isso !!!
MAS POR QUÊ???
Raciocine comigo!!! pq naum se pode declarar uma variavel dentro de um IF?
Pq vc naum sabe se vai ser verdadeiro ou nao …

mas no caso do try{ i = 10; } … vc sabe q ela essa linha vai ser executada. independente de a excecao ser lancada depois … ou se naum tiver excecao…

entendeu ?

A nao ser q o java considere todo o bloco TRY um bloco ambiguo…
naum verificando as possibilidades dentro do bloco … q eu acho q ele deve fazer eh isso !!!

Por exemplo

int i;
try{
 System.out.prinln("JAVA");
 i = 10;
 throw new Exception();
}catch(Exception e){}

nesse caso a excecao eh lancada mas JAVA eh impresso…
ou seja … ele deveria executar com certeza a inicializacao de i …

Alguém tem uma explicacao ?
Ja tentei olhar na Especificacao do JAVA mas naum encontrei :oops:

Eu acredito que o motivo é exatamente o que você citou. O bloco TRY é considerado ambíguo, porque o compilador não tem como saber se, e em que linha de comando, uma exceção pode ser lançada.

Complementando:
Variáveis locais também não podem ser inicializadas em blocos if e while. Podem ser inicializadas el blocos if-else e switch se forem inicializadas em em todos os sub-blocos possíveis. :wink:

[quote=“Robson”]Complementando:
Variáveis locais também não podem ser inicializadas em blocos if e while. Podem ser inicializadas el blocos if-else e switch se forem inicializadas em em todos os sub-blocos possíveis. :wink:[/quote]

Será ???

Bem, lógico que no dia - a - dia você nunca irá fazer isso… mas poder inicializar dentro de um if e while pode !!!

    int var;
    final boolean b = true;
    if (b){
      var = 22;
    }
    System.out.println(var);

    int var2;
    if (true){
      var2 = 22;
    }
    System.out.println(var2);
    
    int var3;
    while(true){
      var3 = 22;
      break;
    }
    System.out.println(var3);

    int var4;
    final boolean b2 = true;
    while(b2){
      var4 = 22;
      break;
    }
    System.out.println(var4);

Perfeitamente válido !!! :lol:

[quote]Bem, lógico que no dia - a - dia você nunca irá fazer isso… mas poder inicializar dentro de um if e while pode !!!
Código:

    int var; 
    final boolean b = true; 
    if (b){ 
      var = 22; 
    } 
    System.out.println(var); 

    int var2; 
    if (true){ 
      var2 = 22; 
    } 
    System.out.println(var2); 
    
    int var3; 
    while(true){ 
      var3 = 22; 
      break; 
    } 
    System.out.println(var3); 

    int var4; 
    final boolean b2 = true; 
    while(b2){ 
      var4 = 22; 
      break; 
    } 
    System.out.println(var4); 

Perfeitamente válido !!! [/quote]

É interessante perceber que nos primeiros casos só funcionou porque foi usada uma variável com final, e o while porque while(true) sempre é verdadeiro. Qualquer coisa diferente o compilador irá reclamar.

isso mesmo!!! se fosse tudo sempre true pra q o IF entaum???
neh!! eh soh pq eh tudo true mesmo, como nosso colega falou!

O compilador do JAVA é muito inteligente :slight_smile: !!! Ele sabe que é sempre o if ou o while recebendo a literal true na condicao de verificacao será sempre executado.

Mas não pode dizer que uma instrução não deve ser inicializada dentro de um if ou while … As regras devem ser bem claras !!!

reparem que o seguinte codigo é valido:


public static void main(String args[]) {
        int i;
        if (new Boolean("true").booleanValue()) {
            try {
                i = 1;
            } finally {
            }

        } else {
            i = 2;
        }

        System.out.print(i);
    }

-> primeiro pq ele n sabe em tempo de compilacao se "new Boolean(“true”).booleanValue()) " é true ou n, mas pode garantir q entrará no if ou else, e em ambos i é inicializado

-> ele aceita a inicializacao do bloco try pq i é inicializado em try, em um bloco try FINALLY. e pode garantir q o bloco try n lancara nenhuma unchecked exception a ser capturada

[quote=“fabiostb”]reparem que o seguinte codigo é valido:


public static void main(String args[]) {
        int i;
        if (new Boolean("true").booleanValue()) {
            try {
                i = 1;
            } finally {
            }

        } else {
            i = 2;
        }

        System.out.print(i);
    }

-> primeiro pq ele n sabe em tempo de compilacao se "new Boolean(“true”).booleanValue()) " é true ou n, mas pode garantir q entrará no if ou else, e em ambos i é inicializado

-> ele aceita a inicializacao do bloco try pq i é inicializado em try, em um bloco try catch. e pode garantir q o bloco try n lancara nenhuma unchecked exception a ser capturada[/quote]

mas aí tá direto, ele não tem o catch !!!