2011-09-27 14 views
6

Pensé que pasaría algo malo cuando terminara una línea como esta. Pero el compilador ni siquiera se quejó. ¿Alguien tiene una idea, por qué esto es legal en Java?El compilador no se queja cuando terminé una línea con dos puntos y comas. ¿Por qué?

displayDataMap.put("dateInterval", getDateInterval());;

Editar: La razón Eclipse no se quejaba era porque en preference->java->compiler->Errors/Warning tuve la declaración vacío: como ignorar.

enter image description here

+2

¿Usted consultó la especificación del idioma? ¿Si no, porque no? – Ingo

+1

Revisé el siguiente enlace para la especificación del idioma, pero mi búsqueda superficial no produjo nada. ¿Tienes un enlace que pueda mirar? http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html – pacman

+1

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.6 – Ingo

Respuesta

10

Es una afirmación vacía y es válida. Como lo señala jwodder, para ser más preciso, el enunciado vacío es la falta de enunciado entre los dos puntos y coma, y ​​podría representarse mediante dos puntos y coma consecutivos o puntos y coma separados por espacios en blanco (es decir, incluyendo nuevas líneas).

IDE like Eclipse le advertirá sobre esto. Si marca la imagen de abajo, he insertado un doble punto y coma en la línea 236. Las líneas rojas fueron añadidos por mí para enfocar la atención, pero Eclipse dar muchas señales visuales:

  • una línea amarilla irregular bajo los puntos y comas .
  • una bombilla con un letrero de advertencia en el margen izquierdo de la línea 236, al pasar el ratón sobre esa línea, aparecerá un pequeño mensaje que dice "Punto y coma innecesario".
  • en la barra que contiene los directorios y paquetes, el signo de advertencia se muestra de nuevo. Se muestra para cada paquete o carpeta fuente, que contiene al menos una advertencia.
  • en el explorador de paquetes y en el ícono del archivo del navegador, se mostrará el mismo ícono de la bombilla (no en esta captura de pantalla).

enter image description here

+1

Específicamente, el vacío entre los dos puntos y comas es una declaración vacía. – jwodder

+3

Y debe evitarse, porque el compilador inserta 10000 NOP en el bytecode para cada instrucción vacía ... no, es broma :) – Ingo

+1

@stivlo. Gracias por la respuesta. Probé usando la versión de Eclipse Indigo y Helios y ninguno de los dos se quejó. – pacman

2

El compilador usa punto y coma para denotar un 'final de la declaración'. Tener dos consecutivamente termina la instrucción anterior a la primera, y luego crea una segunda declaración vacía.

Realmente, incluso se podría hacer esto:

displayDataMap.put("dateInterval", getDateInterval());;;;;;;;;;;;;;; 
0

compilador suele quejarse incluso cuando se acaba de crear un archivo vacío con extensión .java. Es una unidad de compilación vacía y es válida. De la misma manera, un punto y coma es una declaración vacía que es válida.

1

; significa fin de la declaración.

for ;; , el segundo ; implicará que la declaración no consiste en nada.

1

Es una sentencia vacía, es el mismo que si usted hizo esto:

int x = 0; 
; 

No hay problema!

2

Aquí está un ejemplo práctico en C:

#ifndef NDEBUG 
#define Dprintf printf 
#else 
#define Dprintf(X) 
#endif 

if(some_test) 
    Dprintf("It's true!"); 
else 
    Dprintf("It's false."); 

Si NDEBUG se define, el compilador ver:

if(some_test) 
    ; 
else 
    ; 

Esto puede ser útil en algunos casos.

Dado que Java está muy inspirado en C/C++, es algo que conservaron, aunque no es útil y no tiene preprocesador.

puede, si lo desea, ejecute el preprocesador C cpp en su código para realizar este tipo de comportamiento.

Algunos idiomas pueden decir que es un error, depende de ellos elegir.

+0

Es bueno ver por qué una declaración ';;;;' es válida en Java. Tal vez nunca lo sepamos con 100% de certeza. Ahora la pregunta se hace sin embargo: ¿esto cambiará alguna vez y se volverá inválido? – anon58192932

+0

No creo que vaya a cambiar nunca, y la mayoría de la gente usa el mismo compilador JavaC de Oracle. Incluso si lo hace alguna vez, es algo muy simple de actualizar, simplemente llame a una expresión regular en todos sus archivos como s /; {2,} /;/g – wormsparty

2

; representa la sentencia vacía o puede decir que representa la línea de terminación de una instrucción en Java, incluso si pone más de una, es válida en Java. El compilador no le dará ningún error porque esto es válido. incluso la declaración siguiente también es válida:

System.out.println("HI");;;;;;;; 
+0

Gracias, por editar la declaración anterior. – subodh

Cuestiones relacionadas