我是Java的新手,我在理解声明的概念和变量的初始化方面遇到了一些麻烦。
例如,当我这样做时:
public class Foo {
public static void main (String[] args) {
int x, y;
for (x = 0 ; x < 10 ; x++) {
y = x + 1;
}
System.out.println(x);
System.out.println(y);
}
}
它没有编译并且说“变量y可能没有被初始化”。 但是,如果我告诉它只是在循环后打印出x值,它没有任何问题。当然,如果我在开始时简单声明它(说int y = 0;或类似的东西)它会工作,但我想知道为什么x被打印而不是y。
提前致谢!
编辑:
据我所知,编译器实际上并没有检查循环内部以查看变量是否会被初始化,所以它只是说它可能没有被初始化,但是为什么以下代码有效呢?编译器是否检查if循环而不是for循环?
public class Foo {
public static void main (String[] args) {
int x = 0, y;
if (x == 0) {
y = 1;
}
else {
y = 2;
}
System.out.println(y);
}
}
编辑2:
如果我实际上为else部分提供了另一个条件,它看起来像是给了我同样的错误,这样就可以了:
if (x == 0) {
y = 1;
}
else if (x == 1) {
y = 2;
}
所以我猜另一个例子有效,因为y在if和else部分都被初始化了,这意味着无论给出的条件是什么,y都会被初始化。现在我真的明白了。谢谢!!
答案 0 :(得分:10)
局部变量没有默认值,您需要初始化它们。您当然设置了x(x=0
)的值,但编译器不会检查是否实际输入了循环体。因此,请y
赋值0
。
答案 1 :(得分:5)
如果你查看你的代码;你已经在for循环中将x初始化为0,然后用x ++递增它。但是你正在初始化Y内部循环,这可能会或可能不会在运行时执行(与编译时无关)。在Java中,您必须在使用之前初始化局部变量,如果您不这样做,编译器将提示错误。这就是为什么x被打印而不是Y
答案 2 :(得分:1)
这是错误的:
public class Foo {
public static void main (String[] args) {
int = x, y; // Wrong
for (x = 0 ; x < 10 ; x++) {
y = x + 1;
}
System.out.println(x);
System.out.println(y);
}
}
这是正确的:
public class Foo {
public static void main (String[] args) {
int x, y; // Declaration only: x and y are uninitialized
这也是正确的:
public class Foo {
public static void main (String[] args) {
int x = 1, y = 10; // Declaration + initialization
'希望有所帮助......
答案 3 :(得分:1)
直到运行时才能确定for
循环是否会运行一次。因此,初始化不计数(即,编译器不能依赖它,因此它会出错)。
直到运行时才能确定两个中的哪一个 - if
或else
子句 - 将会触发。但是,在编译时我们知道一个或另一个将触发,所以如果你在两者中初始化,编译错误就会消失。
答案 4 :(得分:1)
这取决于两件事:
编译器在任何情况下都会排斥歧义,因此它会在有条件执行的块中见证变量初始化时抛出错误。
答案 5 :(得分:0)
x在for循环(第一个参数)中初始化
答案 6 :(得分:0)
考虑如果你的循环是
会发生什么for (x = 0 ; x < someOtherVariable ; x++) {
并且someOtherVariable
的值恰好为零。该循环根本不会运行,因此永远不会初始化y
。
当然,你编写的循环总是运行十次,因为下限和上限都是硬编码的,但编译器(显然)并没有足够的分析代码来证明。它看到一个仅在循环中初始化的变量,并且遵循循环可能根本不运行的一般规则,它会抱怨变量可能没有被初始化。
BTW,int = x, y;
是无效的Java语法:等号不属于那里。