3
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正在存储一个值,为什么不能j存储.. ??

PS Noob在这里..!!

4

7 回答 7

2

因为想象一下,如果你有arrayOfInts.length==0?

然后你永远不会进入循环——> j 没有初始化。

为了证明我的观点,尝试编译和运行

int[][] arrayOfInts = {};
于 2013-05-31T11:16:53.907 回答
2

原因是,就编译器而言,arrayOfInts.length 可能0运行时。如果发生这种情况,您的 for 循环将永远不会运行- 因此,j永远不会在内部循环中初始化。

于 2013-05-31T11:17:05.830 回答
1

由于arrayOfInts.length 可能为 0,因此您的循环可能永远不会执行。在这种情况下,您的变量j将永远不会被赋值。

于 2013-05-31T11:17:04.083 回答
1

j在您在println语句中使用它之前,需要进行大量计算来检查您是否确实放入了某些东西。

arrayOfInts例如,如果 K 为size ,则不会初始化0

这就是为什么你必须初始化j,让编译器在你使用它之前确保它已经初始化。

于 2013-05-31T11:17:18.193 回答
1

因为它不是给定的,初始化 j 的内部循环将执行。请记住,循环执行是有条件的,因此外部循环(带有 i 的循环)上的条件可能不正确。在这种情况下,初始化 j 的行将永远不会执行。

于 2013-05-31T11:18:09.240 回答
1

假设您的外部for 循环for(i = 0; i < arrayOfInts.length; i++) {永远不会有机会执行某些执行实例(i < arrayOfInts.length当数组长度 = 0 时第一次为假),那么j将保持uninitialized。如果为真,则在 if 块中打印 foundIt没有价值,因此会出错。j

于 2013-05-31T11:18:12.670 回答
1

在java中,每个局部变量都需要初始化。

在 for 循环的第一行,变量 i 被初始化为 0。但编译器不确定第二个 for 循环是否有机会执行。假使,假设

 arrayOfInts.length is 0. 

在这种情况下,j 值将不会被初始化。

一件好事是通过将 if(foundIt) 更改为 if(false) 来测试它,编译将停止抱怨。

编辑 它的全部内容,编译器从不假设事情。它适用于可用的事实,事实说明如下:1)我将永远有一个价值。2 j 可能无法获得值并保持未初始化状态。3)发现它可以是真的。:)

此外,在使用变量之前对其进行初始化是一种非常好的做法。

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

于 2013-05-31T11:22:52.087 回答