2

所以我正在尝试制作一个封装二维字符数组的类。特别是,我想做的是定义默认构造函数,以便封装的二维数组包含默认字符(在本例中为“#”)。我的问题:当我尝试通过嵌套的 foreach 循环系统地用默认字符填充数组时,编译器不承认我正在使用第二个嵌套循环的初始化字符参数 c,尽管我显然使用了赋值 c = '# '。引用 Eclipse,“未使用局部变量 c 的值”。

以下是相关代码:

public class 2DCharArr
{
 private char[][] chars;
 private byte length_x, length_y;

 public 2DCharArr()
 {
  length_x = 10; length_y = 10;
  chars = new char[length_x][length_y];
  for (char[] arr : chars)
   for (char c : arr)
    c = '#'; // Does not signal to Eclipse that c was used.
 }
}

我在 foreach 循环中的语法是否有问题,导致编译器无法确认我对 c 的使用?有人为我解决这个问题会很棒,因为它使我无法使用 foreach 循环来创建包含多维数组的对象,尽管我觉得如果我有能力的话我应该能够做到与语言。提前感谢您的洞察力!

4

2 回答 2

4

使用增强的 for 语句时不能赋值。您将不得不以传统方式迭代它们并将值分配给特定索引。

for(int i= 0; i < chars.length; i++) {
    for(int j = 0; j < chars[i].length; j++) {
        chars[i][j] = '#';
    }
}

其原因在于 JLS 中定义增强的 for 的方式有细微差别:

  • 如果它是一个Iterable,它使用它的迭代器和next()绑定到你的变量的结果。
  • 如果它是数组类型,它会创建一个 for 循环,并将索引值绑定到变量。

在任何一种情况下,您都不能将传入的变量修改为任何有意义的效果,例如赋值。

于 2014-10-01T00:57:32.627 回答
1

您混淆了作业的使用:

int x = 5;
int y = x;
y = 6;

不会改变 x 的值。您的内部循环本质上是“说”:

char c = arr[current index];
c = '#';

这不会改变 的值arr[current index],它只会将 的值更改c为“#”,但保持原始arr数组不变。编译器警告您,您正在创建的变量c从未使用过(意味着从未读取过)。

请注意,此循环可以正常工作:

for (char[] arr : chars)
    for (int x = 0; x < arr.length; x++)
        arr[x] = '#';

外部foreach循环将arr变量分配为指向. 然后为第 x 个元素分配值“#”。char[]charsarr[x]

于 2014-10-01T01:11:37.430 回答