2D数组索引超出界限异常

时间:2013-05-07 19:34:09

标签: java android eclipse multidimensional-array

我是2D阵列的新手,虽然我认为我理解它,但我不确定为什么我会得到这个超出界限的索引。我尝试使地图大小为70x100,但仍然收到同样的错误。它似乎认为我正在寻找索引-1156638823,我不明白为什么。任何帮助将不胜感激!

public int rand(int i) {
    return new Random(i).nextInt();
}

public void createMap() {
    map = new Grid[7][10];
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 10; j++) {
            map[i][j] = new Grid(false, false, false, false, false, false,
                    false, false, false, false, false, false, false, false,
                    false, false);
        }
    }
    map[rand(7)][0] = new Grid(true, false, true, true, false, true, false,
            false, false, false, false, false, false, false, false, true);
    map[rand(7)][rand(10)] = new Grid(true, false, false, false, false,
            false, true, false, false, false, false, false, false, false,
            false, false);
}

logcat的

05-07 19:29:00.183: E/AndroidRuntime(1532): FATAL EXCEPTION: main
05-07 19:29:00.183: E/AndroidRuntime(1532): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.evorlor.dungeonmaster/com.evorlor.dungeonmaster.DM}: java.lang.ArrayIndexOutOfBoundsException: length=7; index=-1156638823
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.os.Looper.loop(Looper.java:137)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at dalvik.system.NativeStart.main(Native Method)
05-07 19:29:00.183: E/AndroidRuntime(1532): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=7; index=-1156638823
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.evorlor.dungeonmaster.DM.createMap(DM.java:101)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at com.evorlor.dungeonmaster.DM.initialize(DM.java:19)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at java.lang.reflect.Method.invoke(Method.java:511)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.internal.events.EventDispatcher$MethodTransformer.invoke(EventDispatcher.java:474)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.internal.events.EventDispatcher.invokeTransformer(EventDispatcher.java:136)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.internal.events.EventDispatcher.dispatch(EventDispatcher.java:109)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.app.internal.ScreenMixin.invokeInitialize(ScreenMixin.java:561)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at sofia.app.Screen.onCreate(Screen.java:186)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.Activity.performCreate(Activity.java:4465)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-07 19:29:00.183: E/AndroidRuntime(1532):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-07 19:29:00.183: E/AndroidRuntime(1532):     ... 11 more

4 个答案:

答案 0 :(得分:4)

您滥用Random。您已调用Random构造函数将初始种子设置为特定值:i。但它不会限制返回的随机值。

nextInt()方法返回随机,不受限制的int

您需要以下代码:

public int rand(int i) {
    return new Random().nextInt(i);
}

nextInt(int)方法将返回范围0的随机整数限制为i - 1。此外,无参数Random构造函数使用系统时间每次生成不同的随机种子(因此不同的随机数)。

使用Random的Java中的随机数是伪随机的 - 它们是确定性的,但它们需要种子才能开始。使用相同的种子将获得相同的随机数。这就是每次使用不同种子很重要的原因,无参数Random构造函数会为您处理。

此外,每次调用Random对象时,都不需要创建另一个rand对象。您可以在类中将其创建为实例变量,只需在rand方法中引用它即可。

答案 1 :(得分:4)

new Random(i).nextInt()没有按照您的想法行事。

您应该使用:

new Random(seed).nextInt(i)

您的版本只是初始化种子,但nextInt()会返回整个范围内的整数,如果您需要更小的范围,则需要指定它,通过指定nextInt(i),您将获得[0,1)中的值1}}

答案 2 :(得分:0)

您使用的Random构造函数错误。其中的参数是种子。不是它将产生的最大数量。

您可以在此处阅读有关种子的内容:http://en.wikipedia.org/wiki/Random_seed

如果需要它来生成从0到X的数字,则需要将X提供给nextInt方法。

new Random().nextInt(X);

答案 3 :(得分:0)

您使用了错误的方法:Random#nextInt()。您以为使用了Random#nextInt(bound)代替了0,产生了bound(包括) - Random范围内的随机整数(不包括在内)。 {{1}}构造函数中的整数只是一个随机种子。