繁体   English   中英

2D数组索引超出范围异常

[英]2D Array Index Out of Bounds Exception

我是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

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

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

您需要以下代码:

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

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

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

此外,您不必在每次调用rand对象时都创建另一个Random对象。 您可以在类中将其创建为实例变量,然后在rand方法中对其进行引用。

new Random(i).nextInt()并没有您认为的那样。

您应该使用:

new Random(seed).nextInt(i)

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

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

例如,您可以在此处阅读有关种子的信息: http : //en.wikipedia.org/wiki/Random_seed

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

new Random().nextInt(X);

您使用了错误的方法: Random#nextInt() 您以为使用的是Random#nextInt(bound) ,它会产生0 (含) bound (不含)范围内的随机整数。 Random构造函数中的整数只是一个随机种子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM