Pontos vírgulas desnecessários não geram erros de compilação, nem em tempo de execução

4 respostas
levimendes

Olá pessoal,

comecei a estudar para a certificação pelo livro SCJP,
nos primeiros códigos que eu estou executando encontrei pontos e vírgulas em lugares desnecessários
no final da linha do método main por exemplo e logo após o loop.
O programa compilou e rodou normalmente.
Aguém sabe explicar o que acontece?
Porque o compilador não reclama?
E pior ainda (eu acho), roda sem problemas?

public class TestDays {

	enum Days {MON, TUE, WED};
	
	public static void main (String [] args) {;
		for (Days day : Days.values())
		
		;;;;;;;;;;;;;;;;;;;;;;;;;;
		
		Days[] days = Days.values();
		System.out.print(days[2]);
	}
}

4 Respostas

leoramos

Em outras linguagens isso também ocorre, cara.
Na verdade, isso tem a ver com as definições sintáticas da linguagem. O autômato que interpreta esse bichinho aí entende que ; é um lexema que leva a um estado final válido. O lexema anterior é um espaço ou uma expressão que já foi avaliada como válida e não interfere nela. Logo, estado inicial e final são válidos - e o “caminho” entre eles é sempre o mesmo, ou seja, é determinístico.
Então, não teria por quê criar uma regra sintática só pra validar que o ; está “desacompanhado”. A complexidade na interpretação aumentaria (com relação à expressões regulares e autômatos finitos) e o benefício é zero.
Abraço!

leoramos

Ah, e talvez eu tenha falado alguma besteira. Cursei compiladores há algum tempo, de repente já me esqueci ou confundi com boa parte desse trem.
Então, se queres mesmo entender esse negócio a fundo, procure sobre análise sintática em compiladores.
Abraço!

E

Se olhar na definição da linguagem ( http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6 ) você vai ver que um “;” sozinho é um “empty statement”.

Observe que não é em todo lugar em que você encontra um “;” que você pode repeti-lo à vontade. Por exemplo, dentro de um for , deve haver exatamente 2 “;”, mesmo que haja alguns lugares vazios. As seguintes declarações são todas válidas.

for (int i = 0; i < 10; ++i) 
...
for ( ; i > 20; --i)
...
for ( ; ; )
...
for (int i = 0; i < 10; )
levimendes

Valeu pelas dicas pessoal.

Abraço.

Criado 28 de julho de 2011
Ultima resposta 28 de jul. de 2011
Respostas 4
Participantes 3