创建新String时出现NullPointerException

时间:2014-05-21 21:40:48

标签: java android eclipse nullpointerexception

  

     

我在列表中添加了A的{​​strong>新实例: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,表示返回行上确实存在错误:{ {1}}。

但是,如果我这样说:

return new String(name);

我没有得到任何例外,但public class A { private String name; @Override public String toString() { return name; } } 返回的是String

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

注意:

为了简单起见,我故意省略了getters / setter,但是他们在原始代码中已经存在,我很确定在调用{之前设置ProjectB属性方式{1}}方法。事实上,如果我调用name方法,则返回的名称完全正常,但我使用的是列表,我需要toString()方法。

这是代码中创建getName() toString()List个对象的部分(A):

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 ) 方法验证了name属性的内容,这没关系。我必须提到的是,第一种方法(使用getName(),没有终结或空检查)在另一个项目上完美运行。

这是new String(name)类的相关部分:

DataAccess

4 个答案:

答案 0 :(得分:4)

当你调用new String(name);时,它会调用下面显示的String的重载参数化构造函数:

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

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

正如您所看到的,代码中的第一行尝试计算传递给构造函数的String的长度。因为在你的情况下,String是null,在该null引用上调用成员变量count会抛出NullPointerException。

注意:在您创建AList的代码中,我没有看到您将对象添加到列表中,但缺少AList.add(a);

答案 1 :(得分:1)

在java new String(null)中将结果导入NullPointerException


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

答案 2 :(得分:1)

    return new String(name);

名称失败为null。它可能发生在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;

答案 3 :(得分:1)

就异常而言,你得到一个空指针,正如@Kakarot所解释的那样。

此行爆炸

original.count

但是如果你想保存自己从null检查等,同时有一个高效 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();
        }
    }

使用字符串构建器是有效的,即使使用空值,您也可以看到上述toString()的输出。

null Some place