这很简单但是让我感到困惑,我了解到身体范围是什么
断点的第一行,但低于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
答案 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作为使用if
,else
,for
,do
和while
大括号的最佳做法建议语句始终,即使正文为空或只包含一个语句。大括号可以提高代码的一致性和可读性。
答案 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";
}
但在第二种情况下,有可能有多行代码,所以没有错误。