在Java多维数组上测试问题时出错
我编写了一些多维数组上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
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.