为什么我们不能在if语句跟随

时间:2015-08-29 17:23:17

标签: java variables if-statement

public class Foo{    
  public static void main(String []args){  
    int a=10;
    if(a==10)
    int x=20;    
  }
}

在编译上面的代码时,编译时会抛出错误。

但是,在下面的代码中它很好。为什么呢?

public class Foo{    
  public static void main(String []args){    
    int a=10;    
    if(a==10){    
    int x=20;
    }
  }
}

我不明白。这些究竟发生了什么?据我所知,我们可以在没有花括号的if语句之后编写一个语句(复合语句块)。

2 个答案:

答案 0 :(得分:13)

为清楚起见,问题在于:

if(a==10)
    int x=20;

...错误为error: variable declaration not allowed here

这是不允许的,因为在if之后有一个特定的语句列表;它们在JLS§14.5中有详细说明:

  • StatementWithoutTrailingSubstatement
  • LabeledStatement
  • IfThenStatement
  • IfThenElseStatement
  • WhileStatement
  • ForStatement

StatementWithoutTrailingSubstatement(上面的第一件事)包括:

  • Block
  • EmptyStatement
  • ExpressionStatement
  • AssertStatement
  • SwitchStatement
  • DoStatement
  • BreakStatement
  • ContinueStatement
  • ReturnStatement
  • SynchronizedStatement
  • ThrowStatement
  • TryStatement

请注意,LocalVariableDeclarationStatement不会出现在该列表中。虽然Block允许LocalVariableDeclarationStatement ,但您的第二个例子没问题。

为什么 不会出现在列表中?推测为什么语言设计师会做他们所做的事情总是很危险的。但是到底是什么:让我们说他们允许了。这是什么意思?它仅限于if的身体吗?那有点无意义,不是吗?除了初始化的副作用(例如int x = foo();)之外,它们没有任何效果,在这种情况下,你应该只编写引起副作用的事物(foo();)。如果作用于if的主体(它最终在包含的范围内),这是相当混乱的,不是吗?除非if的条件为真,否则看起来就像它不会被声明一样......

答案 1 :(得分:0)

好的,首先要始终格式化您的代码,以便更容易阅读。

我从未尝试过这个。但这绝对没有意义。 int x=20是死代码,如果没有{},则只允许一个命令。因此,在这一个命令中定义一个变量,紧接其后再次未定义,因为剩下'if'的上下文。 'x'仅在'if'

的上下文中有效
public class Foo {

    public static void main(String []args){

        int a=10;

        if(a==10)
            int x=20;

    }
}

我猜这个死代码被编译器看作是绝对错误和无意的。

您的其他示例是相同的,但编译器没有注意到它。