不同,有或没有'IF'声明的正文范围

时间:2016-10-05 14:06:29

标签: java

这很简单但是让我感到困惑,我了解到身体范围是什么 断点的第一行,但低于1'st if语句获取错误(不是声明)和2'nd就好了。

我只想要,为什么会收到错误?

if (true)
    String name="Body Test";

if (true) {
    String name="Body Test";
}

例外:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
 Syntax error, insert ":: IdentifierOrNew" to complete ReferenceExpression 
 Syntax error, insert "AssignmentOperator Expression" to complete Assignment 
 Syntax error, insert ";" to complete Statement String cannot be resolved to a variable

4 个答案:

答案 0 :(得分:4)

if (true) String name="Body Test";无效,因为将新变量引入范围不能是有条件的,因为它是在编译时发生的。请注意,Java不够聪明,无法意识到if (true)始终运行。你编写它的另一种方式是绝对正常的,因为{} 总是包围name

这有点类似于在case块的switch块中引入新变量,而不使用{}

答案 1 :(得分:4)

在您的示例中,您尝试使用guard clause声明局部变量name。正如Oracle文档Local Variable Declaration Statements所述:

  

每个局部变量声明语句立即由块包含。

同样来自The if Statement,它具有以下语法:

IfThenStatement:
    if ( Expression ) Statement

在Java规范list of statements中有无声明

在单语句块(没有大括号)的范围内定义变量使得它在作用域之外无法访问。与第一种情况一样,声明未包含在{}块中,因此编译器会出错。

这只是关于声明,在初始化的情况下它起作用:

String name;              // declaration
if (true)
   name = "Body Test";    // initialization (compiles okay)

以及下面的代码将由编译器失败:

if (true)
    String name;          // only declaration (compile error!)

同时Google Java Style作为使用ifelsefordowhile大括号的最佳做法建议语句始终,即使正文为空或只包含一个语句。大括号可以提高代码的一致性和可读性。

答案 2 :(得分:1)

在你的第一个例子中,String name =“Body Test”;是阻止声明。您只能将声明放在没有花括号的情况下。有关更多信息,请阅读此Oracle官方网站:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.2

答案 3 :(得分:0)

if (true)
    String name="Body Test";

上面的代码块会抛出错误,说明变量声明不允许

因为编译器只允许在 if(true)之后的一个语句,其中声明因该变量的范围而无效。

if (true) {
String name="Body Test";
}

但在第二种情况下,有可能有多行代码,所以没有错误。