解
我在列表中添加了
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
答案 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