我遇到了这个非常简单的代码,在我看来,我们必须在我们声明它的同一范围内初始化一个变量,如果是这样,我很困惑为什么。这是一个例子:
class Test
{
public static void main (String[] args)
{
int x; // if initialize x to anything everything works fine
for (int i = 0; i < 3; i++)
{
x = 3;
System.out.println("in loop : " + x);
}
System.out.println("out of loop " + x); // expect x = 3 here, but get an error
}
}
上面的代码产生了这个错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable x may not have been initialized
我很困惑为什么会这样。我希望int x
告诉Java编译器我将在声明int
的范围内创建x
变量x
,然后我将x
初始化为值{ for循环中的3。是什么导致错误?我错过了什么?
作为旁注,非常相似的代码可以像我在C ++中预期的那样工作
#include<iostream>
using namespace::std;
int main()
{
int x;
for(int i = 0; i < 3; i++)
{
x = 3;
cout<<"in loop : "<<x<<endl;
}
cout<<"out of loop : "<<x<<endl; //expect x = 3 here
return 0;
}
我正在使用eclipse for java和Code :: Blocks for C ++。
答案 0 :(得分:4)
编译器不知道肯定会你要进入循环。因此,x
可能永远不会被初始化。
考虑:
class Test
{
public static void main (String[] args)
{
int x; // x has no value
for (int i = 0; i < 0; i++) // Bogus bounds -> never enters loop.
{
x = 3; // Never happens
System.out.println("in loop : " + x);
}
System.out.println("out of loop " + x); // x has no value here!!
}
}
继续并将x
初始化为某些内容。如果你确定将输入循环并分配一个值,那么不要担心初始化值是什么。否则,您现在可以看到为什么需要初始化。
答案 1 :(得分:3)
根据JLS 16 (Definite Assignment)
对于局部变量或空白最终字段x的每次访问,必须在访问之前明确分配x,否则会发生编译时错误。
在这种情况下,编译器不确定for循环,这就是你看到编译时错误的原因。