【问题标题】:Java Array pass-by-referenceJava 数组引用传递
【发布时间】:2012-02-20 22:21:06
【问题描述】:

我有这个代码:

public static int MAX;
public static int MIN;


public static void startGame(){

    MIN = -1;

    MAX = 1;

    int[] randomGridVals = new int[ROWS*COLUMNS];

    fill(randomGridVals);

    System.out.println(Arrays.toString(randomGridVals));

    <MORE CODE>
}

private static void fill(int[] randomGridVals) {

    for(int i = 0 ; i < randomGridVals.length; i++)
    {
        int rnd = MIN + (int)(Math.random() * ((MAX - MIN) + 1));

        randomGridVals[i] = rnd;
    }

}

我希望数组是通过引用传递的,并且数组中有随机值,但是当我尝试将其打印为空时。为什么会这样?

【问题讨论】:

  • MIN和MAX的值是多少?
  • 对不起,它们基本上是随机函数的范围。我更新了代码
  • 您的代码看起来对我来说很好。我使用了 MAX = 222 和 MIN = 111。
  • ROWS 和 COLUMNS 的值是什么? (请注意,全大写意味着这些是某种常量。)
  • 奇怪,我试试看。

标签: java arrays pass-by-reference


【解决方案1】:

从您提供的代码中很难确定。我会检查ROWS*COLUMNS 的值。这可能是 0,因此您创建了一个 0 大小的数组。

【讨论】:

  • 我确信这些常量很好,因为我用它们来构造一个网格。
  • 由于代码打印 [],这证明 ROWS*COLUMNS = 0。
  • @Cemre - 你什么时候设置 ROWS 和 COLUMNS。它们确实应该在声明时设置,因为它们都是大写字母,这意味着“静态最终”。我的猜测是您在运行此例程之后设置它们。
【解决方案2】:

Java isnever pass by referenceIt's always pass-by-value.

至于是否为空,请发布ROWS和COLUMNS或检查它们。

【讨论】:

    【解决方案3】:

    您在哪里定义 ROWS 和 COLUMNS?至少其中一个必须等​​于 0,从而将您的数据结构呈现为 int[0]。

    由于int 是原始类型,因此您的数组开始时填充为 0。由于数组无法调整大小,并且 Arrays.toString 将打印每个单元格(它不会只是跳过 0s- 0 通常在 int[] 中非常重要,一方面!),这个结果不能是你的工件数组未写入。它必须已初始化为长度 0,这意味着 ROWS * COLUMNS == 0。检查ROWSCOLUMNS 的值以及它们的类型——除了 int 之外的令人惊讶的类型在极少数情况下可能会导致这种情况,但 0 的可能性更大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2017-09-25
      • 2011-01-29
      • 2011-08-09
      相关资源
      最近更新 更多