[code="java"]
public class TestArray
{
public static void main(String[] args)
{
Foo[] foos = new Foo[2];
for(int i=0; i<foos.length; i++)
{
foos[i] = new Foo();
}
// for(Foo foo:foos)
// {
// foo = new Foo();
// }
System.out.println(foos[0].name);
}
}
class Foo
{
String name = "yangmiao";
int age = 10;
}
[/code]
如果使用foreach循环,数组实际上仍然没有初始化,执行print语句会报空指针错误,这是为什么?
可以看一些foreach的原理,对于数组类型,其实
Foo[] foos = new Foo[2];
for(Foo foo:foos)
{
foo = new Foo();
}
其实是这样执行的
Foo[] foos2 = foos;
int i = foos2.length;
for(int j = 0;j<i;j++){
Foo foo = foos2[j];
foo = new Foo();
}
可以发现,foo只是个副本,修改了foo对foos[i]并没有影响。
这一点可以通过分析反编译后的bytecode得知。
也可以使用jad,对foreach的程序进行反编译,得到for版本的代码。
我也刚发现这个问题,之前一直是仅做查询使用,所以没遇到这种情况,我搜了一下发现foreach和之前的for循环不是等价的,foreach在涉及索引方面不能成功,参考请看:http://blog.sina.com.cn/s/blog_5d7cccb90100djnk.html
所以如果是赋值的话还是用原来的for循环比较安全