在Java多维数组上测试问题时出错

在Java多维数组上测试问题时出错,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我编写了一些多维数组上Java问题的示例,以了解其初始化和可访问性。我复制了示例中的代码语法,但无法理解如何解码代码 下面的例子,我试图了解多维数组的初始化。我无法掌握语法逻辑,只对代码进行了一次更改以测试我的理解,该示例最初是为了获得String value=exampleStr[0]的输出。我把它改为String value=exampleStr[0][0]发出了错误 public class MyClass { public static void main(String args

我编写了一些多维数组上Java问题的示例,以了解其初始化和可访问性。我复制了示例中的代码语法,但无法理解如何解码代码

下面的例子,我试图了解多维数组的初始化。我无法掌握语法逻辑,只对代码进行了一次更改以测试我的理解,该示例最初是为了获得
String value=exampleStr[0]的输出。我把它改为
String value=exampleStr[0][0]发出了错误

public class MyClass {
    public static void main(String args[]) {
      String exampleStr[] = new String[][] 
      {
          {null,null,null}, 
          new String[] {"a","b","c"}, // not sure what this mean
          {new String()} // not sure of this too

      }[0]; 
// what does the whole block actually mean in a compiler/logic sense ?

      String exampleStr3[] = {null};

// this is where the compiler error came!
      String value = exampleStr[0][0];

// shows 3 for this code when error line is commented out
      System.out.println(exampleStr.length); 

      System.out.println(value);


    }
}
在本例中,语法为
String value=exampleStr[0]
输出
null
,我将其更改为
String value=exampleStr[0][0]并获得错误。

为什么我会出现错误,有人能解释一下代码/编译器的语法行为吗。数组结构如何?

您的初始代码意味着您要创建一个二维数组,但只保留第一个框(在末尾使用
[0]
),这样您就可以使用
exampleStr[0]
读取它的第一个元素,但是
exampleStr[0][0]
是不可能的,因为
exampleStr[0]
不是数组,因此无法使用索引访问其中的内容

String exampleStr[] = new String[][] 
  {
      {null,null,null}, 
      new String[] {"a","b","c"}, 
      {new String()} 
  }[0];
如果我们把它分开,它看起来很像

String array[][] = new String[][] 
  {
      {null,null,null}, 
      new String[] {"a","b","c"}, 
      {new String()} 
  };
String exampleStr[] = array[0]; // which is the {null,null,null} part

2-dim阵列的详细信息以及其中的详细信息:

首先,为了让它工作,
exampleStr
应该是一个二维数组,带有
[]]

所以这里有双
[]
所以它是一个类型为
String
的二维数组,这意味着,您有一个外部数组,每个框可以包含一个(内部)字符串数组

对于外部阵列的每个框,您有:

  • {null,null,null}
    三倍于
    null
    元素的数组
  • newstring[]{“a”、“b”、“c”}
    3个
    String
    的数组可以在
    {“a”、“b”、“c”}
  • {new String()}
    一个空
    字符串的数组
    ,与
    {'}


  • 然后
    exampleStr[0][0]
    意味着访问第一个框的第一个元素

    根据我的理解,您首先声明一个一维数组
    exampleStr[]
    。然后,您将创建一个二维数组,但将其下标为0,即,您将选择索引为0的数组,该数组包含空元素

    exampleStr[0][0]
    =>使用第一个
    [0]
    选择索引0处的第一个元素,这是一个空类型。将对该元素调用第二个
    [0]
    ,该元素为空类型,因此无效

    从本质上讲,您首先并不是在创建二维数组

    将您的代码更改为此,它将工作:

    public static void main(String args[]) {
        String exampleStr[][] = new String[][]
                {
                        {null,null,null},
                        // creates a 1-d String[], -> {"a", "b", "c"} is enough
                        new String[] {"a","b","c"},
                        // creates an array containing an empty string, -> {""} would be equivalent
                        {new String()} 
    
                };
    
        String exampleStr3[] = {null};
    
        String value = exampleStr[0][0];
    
        System.out.println(exampleStr.length);
    
        System.out.println(value);
    }
    

    编辑:我在上面代码段的注释中添加了问题的答案。

    哇,这是一个奇怪的例子,你在哪里找到这样的东西的?我相信现在的情况是exampleStr实际上是一个一维数组,所以没有exampleStr[0][0]

    首先,Java中并没有像C#这样的语言中那样真正的多维数组,但是有数组数组。花括号语法是初始化数据结构的一种方法

    String exampleStr[] = new String[][] // This declares an array of arrays.
          {
              {null,null,null}, // first column values
              new String[] {"a","b","c"}, // second column values
              {new String()} // empty string is only element added to third column
    
          }[0]; // This initializes exampleStr to the first column values above.
    

    exampleStr是长度为3的一维数组,其元素为null、null和null。您将以exampleStr[0]、exampleStr[1]和exampleStr[2]的形式访问这些值。希望这有帮助

    exampleStr
    变量是一个一维字符串数组,因此它对Java编译器(和我)来说毫无意义。您试图将其当作二维数组来使用。您现在可以考虑接受答案;)我不同意你的第一句话。将exampleStr保留为一维数组,不要尝试将其用作二维数组,这样一切都会正常工作。我认为这是一个练习,让OP了解一维数组和二维数组之间的区别,以及二维数组的行本身是一维数组。为什么它应该是二维数组?你不知道这个例子想展示什么。你可能仍然想删除你答案中错误的第一部分,正如@JamesKPolk和我自己指出的那样。@HovercraftFullOfEels我已经改变了顺序,只把2维部分作为一个补充好吧,我想这是更好的汉克斯在Java练习本中发现的,该示例想知道
    exampleStr[0]
    的输出是空的。我无法理解该声明发生了什么,因为当我尝试使用
    String value=exampleStr[1][0]访问“a”时我得到了所需的错误数组,但找到了字符串,在此代码中是否可以访问值“a”、“b”、“c”?您正在使用二维数组的第一列(第0列)初始化一维数组。要访问“a”、“b”或“c”,您必须初始化
    exampleStr[]=newstring[]]{…}[1]
    。您的意思是,我们可以将一个M-d数组传递给一个1-d数组吗?在本例中,我创建了一个一维数组array[],并为其赋值array?如果是这样的话,我将如何访问字符串数组“a”、“b”、“c”?当我尝试
    exampleStr[1]
    时,我得到一个数组越界错误。如果我将其更改为
    exampleStr[][]
    ,我可以使用
    exampleStr[1][0]
    访问“a”。在赋值语句期间,例如,
    String a=“a”首先计算
    =
    右侧的所有内容。在您的示例中,首先创建一个二维阵列,然后选择二维阵列中的一个阵列。此选择是一个一维数组,然后将其分配给您的
    exampleStr[]
    <代码>字符串示例str[][]={{“a”,“b”},{“c”,“d”};//这是一个二维阵列
    String exampleStr[] = new String[][] // This declares an array of arrays.
          {
              {null,null,null}, // first column values
              new String[] {"a","b","c"}, // second column values
              {new String()} // empty string is only element added to third column
    
          }[0]; // This initializes exampleStr to the first column values above.