当我初始化我的StringBuilder数组时,我会在调用它时收到NullPointerException。
StringBuilder[] sb = new StringBuilder[2];
for(StringBuilder s : sb){
s = new StringBuilder();
}
System.out.println(sb[0].toString());
但是,在将其更改为以下内容后,错误消息将消失。谁能解释一下这些差异是什么?
StringBuilder[] sb = new StringBuilder[2];
for(int i = 0; i < 2; i++) {
sb[i] = new StringBuilder();
}
System.out.println(sb[0].toString());
答案 0 :(得分:1)
StringBuilder[] sb = new StringBuilder[2];
for(StringBuilder s : sb){
s = new StringBuilder();
}
System.out.println(sb[0].toString());
sb [0]为空,因为您没有设置sb [0] =任何地方
这一行
for(StringBuilder s : sb){
正在做:从sb
获取每个StringBuilder,名称为s
变量。如果您分配给s inside循环,那么您可以使用新的字符串构建器从数组(在这种情况下为null)中简单交换构建器,但是您没有进行分配。
所以你正在做的是改变s
而不是sb[x]
答案 1 :(得分:1)
for-each循环中的s
在第一次迭代(或任何其他迭代)中与sb[0]
不同义。这是一个引用sb[0]
的新变量。这就像你做了以下几样:
StringBuilder s = sb[0];
s = new StringBuilder(); // s is not null, but sb[0] is still null!
System.out.println(sb[0].toString); // NPE
答案 2 :(得分:1)
为了更好地理解它,我们可以用另一种方式编写第一个循环:
for(int i = 0; i < sb.length; i++) {
StringBuilder temporary = sb[i];
temporary = new StringBuilder();
}
这个
for(StringBuilder s : sb)
相当于:
for(int i = 0; i < sb.length; i++)
StringBuilder temporary = sb[i];
注意初始化临时变量并不意味着您初始化数组 sb [i] 中的元素,它们完全不同