public class Test {
public static void main(String... args) {
int[][] arrayOfInts = {
{23, 3, 65, 46},
{65, 55, 2, 3},
{55, 22, 35, 47}
};
int i, j, toFind = 2;
boolean foundIt = false;
search:
for(i = 0; i < arrayOfInts.length; i++) {
for(j = 0; j < arrayOfInts[i].length; j++) {
if(arrayOfInts[i][j] == toFind) {
foundIt = true;
break search;
}
}
}
if(foundIt)
System.out.println("Element found at index " + i + ", " + j);
else
System.out.println("Element not found");
}
}
亲爱的,
我在编译上面的代码时遇到了麻烦。当我将整数变量j初始化为0(j = 0
)时,我的代码工作正常。
但我的问题是Why should i initialize j = 0 ?
为什么我在行
variable j might not have been initialized
错误
System.out.println("Element found at index " + i + ", "+ J);
如果我的int变量i
存储的值为什么cant j
存储.. ??
P.S。 Noob在这里.. !!
答案 0 :(得分:2)
因为想象一下,如果你有arrayOfInts.length==0?
然后你永远不会进入循环 - &gt; j未初始化。
要证明我的观点,请尝试使用
进行编译和运行int[][] arrayOfInts = {};
答案 1 :(得分:2)
原因是,就编译器而言,arrayOfInts.length
可能在运行时为0
。如果发生这种情况,你的for循环永远不会运行 - 因此,j
永远不会在内循环中初始化。
答案 2 :(得分:1)
由于arrayOfInts.length
可能为0,因此您的循环可能永远不会被执行。在这种情况下,您的变量j
永远不会被赋值。
答案 3 :(得分:1)
在j
语句中使用它之前,需要进行大量计算才能确定是否在println
中放了一些内容。
arrayOfInts
的大小为0
,则不会初始化。
这就是为什么你必须初始化j
,让编译器确保它在你使用之前已经初始化了。
答案 4 :(得分:1)
因为初始化j的内部循环不会被执行。请记住,循环执行是有条件的,因此外循环(带有i的循环)的条件可能不正确。在这种情况下,初始化j的行将永远不会执行。
答案 5 :(得分:1)
假设你的外部 for循环for(i = 0; i < arrayOfInts.length; i++) {
永远不会有机会为某个执行实例执行(当第一次i < arrayOfInts.length
false时,当数组的长度= 0时),然后{{1将保持未初始化。如果j
为真,则foundIt
无值打印,如果阻止因此错误。
答案 6 :(得分:1)
在java中,每个局部变量都需要初始化。
在for循环的第一行,变量i被初始化为0.但编译器不确定第二个for循环是否有机会执行。假设
arrayOfInts.length is 0.
在这种情况下,j值不会被初始化。
一个好处是通过将if(foundIt)更改为if(false)来测试它,编译将停止抱怨。
修改强> 一切都是关于,编译器永远不会假设的东西。它适用于可用的事实,并且其中的事实说明如下: 1)我将永远有一个价值。 2 j可能无法获得值并保持未初始化状态。 3)发现它可以是真的。 :)
此外,在使用变量之前初始化变量是一个非常好的做法。
类级别变量在类初始化时自动初始化为其默认值。但方法局部变量不是,因此抱怨/编译时错误。