Atribuição variável local

11 respostas
Gustavo_Santos

Galera li no livro da Keity, que quando eu declaro uma variável local + não
inicializo, e tento inicializar ela em um bloco condicional, para depois usar-la,
daria um erro de compilação, segue:

public void metodo() {
		int i;
		
		while(true) {
			i = 10;
		}
	System.out.println(i); // BUM !
	}
	
	public void metodo2() {
		int i;
		
		if(10 == 10) {
			i = 10;
		}
		System.out.println(i); // AQUI FUNFA LEGAL !
	}

Porque no primeiro método não funfa, e no segundo funfa ?!

11 Respostas

robsonsm

o erro nao ta na variavel e sim no codigo abaixo deste loop, pois o loop nunca vai terminar, entao qualquer codigo abaixo dele vai dar erro de codigo nao alcancavel.

A

fora do escopo:

public void metodo(){ int i; while (true){ i = 10; System.out.println(i); } }

Gustavo_Santos

Opa, blz ! vlw Brother !

Gustavo_Santos
public void metodo() {  // Scopo de i começa aqui
     int i;  
     while (true){  
         i = 10;  
         System.out.println(i);  
     }  
 } // e termina  aqui

Não cara, está perfeitamente no scopo !

evertonsilvagomesjav
robsonsm:
o erro nao ta na variavel e sim no codigo abaixo deste loop, pois o loop nunca vai terminar, entao qualquer codigo abaixo dele vai dar erro de codigo nao alcancavel.

Não acredito que seja isso, dá uma olhada:

int i;   
         int b = 10;
         
    	    while(b == 10) {   
    	        i = 10;   
    	        b = 9;
    	    }   
    	
    	System.out.println(i); // BUM !

Aqui responde sua duvida: http://www.guj.com.br/posts/list/216853.java

M

Na verdade temos dois problemas nesse código:

1-quando o compilador sabe que um loop será infinito já no momento da compilação e tem algum código após o loop. Por exemplo, quando fazemos um loop dessa forma

int i;  
	      
	    while(true) {  
	        i = 10;  
	    }  
	    System.out.println(i); // BUM !

no tempo de compilação já é possível descobrir que é um loop infinito. Daí o compilador avisa: “Amigo, eu sei que você sabe o que está fazendo, mas tem um código após esse loop que não será alcançado”.

2-quando não é possível saber, no tempo de compilação, se a variável será inicializada. Vamos imaginar que o loop tenha sido feito assim:

int i;     
        int b = 10;  
          
        while(b == 10) {     
            i = 10;     
            b = 9;  
        }     
      
        System.out.println(i); // BUM !

no tempo de compilação, o compilador não sabe qual o valor da variável b. Então ele simplesmente avisa: “Não querendo ser chato, mas você tem uma variável que eu não tenho certeza se foi inicializada, pois, antes da execução, eu não sei o valor de b. Você poderia por gentileza atribuir um valor a mesma”.

No segundo método:

public void metodo2() {  
	    int i;  
	      
	    if(10 == 10) {  
	        i = 10;  
	    }  
	    System.out.println(i); // AQUI FUNFA LEGAL !  
	}

o compilador não reclama porque, no tempo de compilação, ele sabe que 10 == 10 é verdadeiro e que a variável vai ser inicializada.

Moral da história: Faça o compilador feliz! :slight_smile: É sempre bom inicializar a variável local(mesmo que seja com seu valor padrão) na linha onde é criada, para melhorar a legibilidade do seu código e facilitar o trabalho do compilador.

Gustavo_Santos

Acho que é por aii mesmo, como já foi dito:

public void metodo2() {
		int i;
		int a = 10;
		int b = 10;

		if (10 == 10) { //LITERAL, O COMPILADOR SABE QUE 10 == 10 IAII ELE LIBERA. SE FOSSE != ELE RECLAMARIA COM UM ERRO.
			i = 10;
		}
		System.out.println(i);
	}

JÁ ASSIM:

public void metodo2() {
		int i;
		int a = 10;
		int b = 10;

		if (a == b) { // COMO OS VALORES ESTÃO EM UMA VARIÁVEL, O COMPILADOR SÓ SABE O TAMANHO EM TEMPO DE EXECUÇÃO
			i = 10;
		}
		System.out.println(i); // SENDO ASSIM ELE DÁ ERRO TANTO PARA O == QUANTO PARA O !=
	}

Grato a todos !!! (se eu estiver errado me corrijam em !! ^^ )

A

independentemente dele só saber em tempo de execução ou compilação -> a condição não é sempre verdadeira? pq então ele não fica em loop eterno? não entendí…

obrigado a todos pela ajuda,
André AS :lol:

M

Verdade, nao se pode usar uma variavel local nao inicializando,
ele nao reclamo no segundo exemplo pois a variavel ele sabia q ia ser iniciada(sabia isso em tempo de compilaçao) pois 10 == 10

robsonsm

não confundam loop com o if. O WHILE é um loop o IF não.

ViniGodoy

Ninguém falou que o código depois irá funcionar.

O que querem saber é se haverá ou não um erro de compilação. Mas em alguns casos descritos aqui, o código fica em loop infinito e não funciona mesmo. Mas vc só vai descobrir isso na hora que roda-lo, o compilador não te avisará nada.

Criado 19 de setembro de 2010
Ultima resposta 20 de set. de 2010
Respostas 11
Participantes 7