2012-02-09 8 views
57

¿Por qué este primer if compila bien y el segundo falla?Error del compilador al declarar una variable en el interior si la condición y las llaves no.

if(proceed) {int i;} // This compiles fine. 
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token) 
+2

relacionadas: comunicado [objeto crear en Java no lo hace permitir el uso de un bucle de una sola línea. ¿Por qué?] (Http://stackoverflow.com/questions/8145663/object-creating-statement-in-java-doesnt-allow-to-use-a-single-line-loop-why) – Lion

Respuesta

72

Debido a que la especificación de lenguaje dice así:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

Una declaración introduce una entidad en un programa e incluye un identificador (§3.8) que se puede utilizar en un nombre para referirse a esta entidad Una entidad declarada es uno de los siguientes:
...
Una variable local, uno de los siguientes:
* Una variable local declarada en un bloque (§14.4)
* Una variable local declarada en una sentencia for (§14.14)

Su primer ejemplo está declarando i dentro de un bloque (denotado por llaves). Su segundo no es, ni es una declaración for.

Editado para agregar: Lo que simplemente hace que los bienes comunes tengan sentido. Si estuviera permitido, sería inútil. Inmediatamente quedaría fuera del alcance.

+1

Sé que es inútil. Pero quiero saber cuál es la regla detrás de esto. Y entendí tu punto, Brian. Gracias. – namalfernandolk

+5

El JLS (Java Language Spec) siempre es el lugar para ir :) Honestamente, es sorprendente que algunas de las cosas que aprendes solo lean partes de ella en tu tiempo libre; Sé que he aprendido mucho que de otro modo no hubiera sabido. –

+2

En realidad, la segunda declaración declararía la variable local en el bloque que contiene la instrucción 'for', por lo que esta sección de JLS no se aplica. La respuesta de Daniel apunta a la verdadera razón por la cual esta sintaxis no es válida. – Joni

12

Esto se debe a que no sería un código útil. Si tiene una instrucción if sin llaves ({}), solo se ejecuta la primera línea/instrucción después de if. Entonces, si solo declaras una variable local, no se puede usar en ningún otro lado. Entonces declararlo es absolutamente superfluo.

if(proceed){ 
int i= 0; 
// variable i can be used here 
//... 
} 

if (proceed) int i; // i can not be used anywhere as it is a local variable 
+0

Esto es sensato explicación –

53

A partir del Java Language Spec.

 
    Block: 
      { BlockStatementsopt } 

    BlockStatements: 
      BlockStatement 
      BlockStatementsBlockStatement 

    BlockStatement: 
      LocalVariableDeclarationStatement 
      ClassDeclaration 
      Statement 

y

 
    IfThenStatement: 
      if (Expression) Statement 

Parece que int i es una LocalVariableDeclarationStatement, no un Statement. Entonces no funciona.

+16

+1. Esta es la verdadera razón por la cual la sintaxis no es válida. La sección JLS sobre las declaraciones mencionadas en la respuesta de Brian está relacionada, pero no es la verdadera razón. – Joni

3

if (proceda) int i;

Si usamos la declaración if sin llaves, se ejecutará solo la primera línea con el if para el modo condicional. Otras líneas se ejecutarán normalmente.

Esto es un error de compilación, porque la declaración de variable local ocurre de manera condicional y el compilador asume que no es alcanzable con la instrucción falsa.

Si usa llaves, la declaración de variables y el uso de la variable local dentro del bloque y, por lo tanto, el compilador suponen que es un código alcanzable. Entonces no hay errores de compilador.

+0

El compilador * define * que no es alcanzable, y porque su alcance ha finalizado, no porque la declaración sea falsa. – EJP

0

Como en Java/C++, si escribimos sin llaves, solo se ejecuta la primera declaración En este caso, la variable i no sirve de nada.Usted está declarando que en caso de declaración y su ámbito de aplicación finalizará después de esta declaración, que es inútil

En C++, esto está permitido, pero Java no permite esta

+0

Gracias abhi120, sé que es inútil. Pero quiero saber cuál es la regla detrás de esto. Ver la respuesta de Brian Roach. – namalfernandolk

+0

Por cierto, no soy el que rechazó su respuesta abhi120. :) – namalfernandolk

Cuestiones relacionadas