初始化对象后出现NullPointerException

时间:2018-05-11 20:06:13

标签: java

当我初始化我的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());

3 个答案:

答案 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] 中的元素,它们完全不同