[英]Is variable when accessed from outside the For loop is not possible in Java if declaration is done in main method & initialization inside loop?
class Myclass {
public static void main(String[] args) {
int x; // Declared in main method
if (true) {
for (int i = 0; i < 5; i++) {
x = 5;// initialized inside loop
}
}
System.out.println(x);// accessing outside for loop
}
}
这给出了一个错误:变量x可能尚未初始化System.out.println(x); ^ 1个错误;
但是,下面的代码工作正常
class Myclass {
public static void main(String[] args) {
int x; // Declared in main method
if (true) {
x = 5;// initialized in if block
for (int i = 0; i < 5; i++) {
// x=5;
}
}
System.out.println(x);// accessing outside if loop
}
}
在这两个代码中,唯一的区别是在第一种情况下,变量在“ for循环”中初始化,而在第二种情况下,变量在“ if块”中初始化。 那为什么会有所作为。 请给我解释一下,因为我找不到真正的原因。
问题在于,编译器在访问x
时并不知道x
将被初始化。 这是因为编译器不会检查循环主体是否会实际执行(在极少数情况下,即使这样的简单循环也可能无法运行)。
如果条件并非始终为真,则对于if块也是如此,即,如果您使用这样的布尔变量:
int x;
boolean cond = true;
if( cond ) {
x = 5;
}
//The compiler will complain here as well, as it is not guaranteed that "x = 5" will run
System.out.println(x);
您作为人类会说“但是cond
初始化为true
并且永远不会改变”,但是编译器不确定(例如由于可能的线程问题),因此它会抱怨。 如果将cond
作为最终变量,则编译器将知道初始化后将不允许cond
进行更改,因此编译器可以内联代码以再次有效地具有if(true)
。
仍然可以访问程序仍然有可能永远不会访问for块。 由于编译器在for循环外不满足var的任何其他初始化要求,因此会给您一个错误。 为了进行编译,您必须使用默认值初始化变量:
class Myclass {
public static void main (String[] args) {
int x = 0; // Declared in main method and init with a default value.
if(true) {
for(int i=0;i<5;i++) {
x=5;// Reinitialized inside loop
}
}
System.out.println(x); // No problems here.
}
}
在此代码中:
公共静态void主(String [] args){
int x; // Declared in main method
if(true)
{
for(int i=0;i<5;i++)
{
x=5;// initialized inside loop
}
}
System.out.println(x);//accessing outside for loop
}
x
仅在循环运行时设置。 编译器认为这种可能性永远不会发生。
在另一种情况下: if(true)
编译器识别为“这将发生”
如果要避免这种情况,请更改
int x;
至
int x = 0; // or use another default variable
如果将if块中的条件从true
更改为false
,则会收到与variable 'x' might not have been initialized
相同的错误。 当您执行if(true)
,编译器可以理解if块中的代码将始终运行,因此变量x将始终被初始化。
但是,当您在for循环内初始化变量时,可能会发生for循环从未运行且变量未初始化的情况。
public static void main(String[] args) {
int x; // Declared in main method
if(false)
{
x=5; //compile error
for(int i=0;i<5;i++)
{
//x=5 initialized inside loop
}
}
System.out.println(x);
}
为了避免这种情况,将变量初始化为int x = 0;
在java for
运行时评估for
循环中,因此编译器忽略对循环内变量初始化的检查,这就是“ x”必须使用值初始化的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.