对于循环工作,但For Each不。 为什么?

在包含forEach循环的行上抛出exceptionexception,但据我所知,此代码没有任何问题。 for循环从char数组的元素0开始并循环直到它到达最后一个元素…但是当我使用更长的for循环尝试此代码时,即,

for(int i = 0; i < nested.length; i++) 

代码按预期工作。

为什么for循环工作和forEach循环在这种情况下不起作用?

  public static void main(String[] args) { String S = "hello"; String curly1 = "{"; String box1 = "["; String p1 = "("; String curly2 = "}"; String box2 = "]"; String p2 = ")"; char[] nested = S.toCharArray(); int flag = 0; if(nested[0] != curly1.charAt(0)) flag = 0; if(nested[nested.length-1] != curly2.charAt(0)) flag = 0; for(char i : nested) { if(nested[i] == curly1.charAt(0) && nested[(i+1)] == box1.charAt(0) || nested[i] == box1.charAt(0) && nested[(i+1)] == p1.charAt(0)) { flag = 1; } else if(nested[i] == p2.charAt(0) && nested[(i+1)] == box2.charAt(0) || nested[i] == box2.charAt(0) && nested[(i+1)] == curly2.charAt(0)) { flag = 1; } else { flag = 0;} } System.out.println(flag); } } 

如果你需要在循环使用中使用索引访问某些内容,而不是foreach(enhaced for)。

现在,您使用char类型的变量i访问nested数组。 变量i表示正在迭代的nested数组的元素。 因此,如果使用此变量访问数组,则其值将隐式转换为其int表示forms(例如'a' == 97 ),这将导致exception。

在你的情况下,你需要for循环,或者将当前索引值保存在其他变量中,并在每次迭代时递增它,因为你不能使用增强的这种类型的索引算术: nested[i + 1]

foreach循环不会为您提供索引,它会为您提供数组中的元素。 所以char i是数组中的chars之一。 在那之后,你说nested[i]好像i是一个索引,但事实并非如此。 chars具有数值,但数值可能大于数组的长度。 另外,使用foreach循环时,在尝试使用nested[(i+1)] ,没有很好的方法可以在迭代之后获取元素。 坚持使用普通for循环。

因为在每个版本中你都试图通过字符元素访问数组索引。

for(char i:nested){//这里我是一个不是数组索引的字符,所以嵌套[i]没有访问正确的索引。 }

foreach循环将i中的字符传递到数组中。 你无法用这种循环完成你想要的东西,因为你无法预测下一个角色

 for(char i : nested) { if(i == curly1.charAt(0) && ... 

在第一种情况下( for(int i = 0; i < nested.length; i++) ),变量i是数组的索引。

在第二种情况下,您使用forEach迭代构造,它遍历元素,而不是通过索引。

for(char i : nested)的构造具有误导性,因为它让你仍然认为i是索引,而事实并非如此。 如果你写for(char element : nested) ,那么代码将是明确的,而不是nested[i]你应该只使用element

但是,使用此方法,您将无法访问数组中的下一个元素( nested[i+1] ),因此这种迭代不适合您的情况。

在foreach for(char i:nested)循环中, i是数组中的元素而不是数组的索引

你可以先初始化数组索引然后在for循环中递增它;

 int index =0; for(char i : nested) { index ++; }