我的简单java代码出错..!

时间:2013-05-31 11:14:34

标签: java

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在这里.. !!

7 个答案:

答案 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)发现它可以是真的。 :)

此外,在使用变量之前初始化变量是一个非常好的做法。

类级别变量在类初始化时自动初始化为其默认值。但方法局部变量不是,因此抱怨/编译时错误。