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
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.
[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. [/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 !!! 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 !!!