[英]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;
}
}
我没有任何异常,但返回的String
为null
。
我使用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.