Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图在If块内声明变量时给出编译错误的单行If语句。原因是什么?_Java_If Statement_Compiler Errors - Fatal编程技术网

Java 试图在If块内声明变量时给出编译错误的单行If语句。原因是什么?

Java 试图在If块内声明变量时给出编译错误的单行If语句。原因是什么?,java,if-statement,compiler-errors,Java,If Statement,Compiler Errors,单行If语句在试图在单行If块内声明和分配变量时出现编译错误。 代码如下: if(true) String msg = "Hellow"; String msg; if(true) msg = "Hellow"; 但是一旦我在If块之外声明了变量,它就不再抱怨了。 代码如下: if(true) String msg = "Hellow"; String msg; if(true) msg = "Hellow"; 有人能解释一下原因吗?这里可能有一个JLS

单行If语句在试图在单行If块内声明和分配变量时出现编译错误。 代码如下:

if(true)
    String msg = "Hellow";
String msg;
if(true)
    msg = "Hellow";

但是一旦我在If块之外声明了变量,它就不再抱怨了。 代码如下:

if(true)
    String msg = "Hellow";
String msg;
if(true)
    msg = "Hellow";

有人能解释一下原因吗?

这里可能有一个JLS的位置,描述内容只能是一个字段赋值/方法调用/其他类似的操作(即变量声明以外的内容),但如果它编译了,它显然是一个NOOP

声明一个范围为单行的变量是没有用的,因此这将意味着一个编程错误。错误消息没有说得很清楚,但基本原因是“不允许这样做,因为语法上是这样说的”

通过使用大括号提供更大范围的可能性,没有错误

if(true) {
    String foo = "bar"; // Compiles fine
}

如果我们在一个单行If块中初始化一个变量,我们就不能在程序中的任何其他地方使用它,这就是编译错误的原因。同样的原因是,在java中,如果我们将任何代码放在return语句之后,不可访问的代码都是编译错误

编译错误取决于变量的范围。如果变量范围增加到多行,如下面的代码部分所示,则可以进行声明

if(true)
    for(int a=0;a<5;a++)
        System.out.println(a);   //Compiles Fine
if(真)

为了(inta=0;a在if语句中声明变量,它需要在大括号{}中。 因此,这应该是可行的:

if(true) {
    String msg = "Hellow";
}

但是,这个变量不能在if块之外访问。

这非常有趣。 我发现了一些我以前读过的东西

所以它不起作用

局部变量声明是一个语句,所以它不会给出错误。 所以这是有效的

串味精; 如果(真)
msg=“Hellow”

即使您将if设置为始终执行,java编译器也只允许您访问if语句之外的变量,如果您还向其添加了else块,那么该变量绝对不会不初始化为感兴趣的块!我想无论如何都不会有人希望这样做(因为您永远无法使用
msg
)@Appleman您是否在声明字符串msg=“Hellow”;“If-then”之后在任何其他地方使用“msg”变量。如果是,请检查其内部If块或外部。@SachinSarawgi不,我没有在任何其他地方使用“msg”变量名称。