繁体   English   中英

创建新的String时出现NullPointerException

[英]NullPointerException when creating new String

我在列表中添加了一个A 实例aList.add( new A() ) ,其name属性当然为null, 而不是添加实际的初始化实例 很抱歉这个愚蠢的问题。


我有A ProjectA类,它重写其toString方法以返回其name属性的克隆,如下所示:

public class A {
    private String name;

    @Override
    public String toString() {
        return new String(name);
    }
}

然后,我将此库导出到jar中,并将其导入到ProjectB ,当我调用a.toString()我得到一个NullPointerException ,它说在返回行上有一个错误: return new String(name);

但是,如果我这样说:

public class A {
    private String name;

    @Override
    public String toString() {
        return name;
    }
}

我没有任何异常,但返回的Stringnull

我使用Eclipse构建了jar( ProjectA ),并将其导入了ADT( ProjectB -Eclipse)。

注意:

为了简单起见,我有意省略了getters / setter方法,但是它们位于原始代码中,并且我确定在调用toString()方法之前我已经设置了name属性的方式。 实际上,如果我调用getName()方法,则可以很好地返回名称,但是我正在使用列表,因此需要toString()方法。

这是创建A对象List (也是ProjectA )的代码部分:

ArrayList<A> aList = new ArrayList<Categoria>();
for (int i = 0; i < random.nextInt(3)+1; i++) {
    A a = new A();
    a.setId(0);
    a.setName("Test name");
    a.setDescription("Test desc.");
    aList.add(a);

    Log.d("app", "Created object A: "+a.getName()); // The name is displayed OK here
}
aList.trimToSize();

这就是代码中toString()方法被称为( ProjectA )的确切部分:

new ArrayAdapter<A>(
    actionBar.getThemedContext(),
    android.R.layout.simple_list_item_1,
    android.R.id.text1, 
    DataAccess.getAList() // The ArrayAdapter class calls the toString method to populate a list
)

如您所见,我实际上通过getName()方法验证了name属性的内容,并且可以。 我必须提到,第一种方法(使用new String(name) ,无需使用finals或null检查)可以完美地在另一个项目上工作。

这是DataAccess类的(相关部分):

public final class DataAccess {
    private static final Data data;
    public static Arrayist<A> getAList() {
        return this.data.getAList();
    }
}

当您调用new String(name); 它调用String的重载参数化构造函数,如下所示:

   public String(String original) {
    int size = original.count;

    ........ 
    .........
   }

如您所见,代码中的第一行尝试计算传递给构造函数的String的长度。 由于在您的情况下String为null调用该null引用上的成员变量计数将引发NullPointerException。

注意:在创建AList的代码中,我看不到您将对象添加到列表中,即AList.add(a); 不见了

在java中, new String(null)结果进入NullPointerException


@Override
public String toString() {
    if(name!=null){
        return name;
    }else{
        return "";
    }
}
    return new String(name);

如果名称为null将失败。 它可能发生在A a = new A(); System.out.println(a): A a = new A(); System.out.println(a):

使用的构造函数String(String)是Java开头的遗迹,让人联想到C ++复制构造函数。

在Java中,String是不可变的,并且Java不需要复制构造函数。

两种解决方案:

    return String.valueOf(name); // Would return "null" for null.
    return name == null ? "" : name;

就异常而言,您将得到一个空指针,如@Kakarot所解释。

这条线炸了

original.count

但是,如果您想避免进行空值检查等,并且同时拥有比用户有效的 toString()方法,则类似于这样的事情。

   public class A {
        private String name = null;
        private String address = " Some place";

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            return sb.append(name).append(address).toString();
        }
    }

使用字符串生成器非常有效,即使使用null值,也可以看到上述toString()的输出。

null Some place

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM