将空对象转换为字符串

19

我编写了一款Android程序,从Web服务加载值到表格行中。但是该值为空,因此我需要将其转换为字符串。有人可以告诉我如何做吗?

try{                    

    SoapObject request = service.getRequest();
    SoapSerializationEnvelope envelope = service.getEnvelope(request);
    SoapObject response = service.getResponse(envelope);
    Log.i("Service Master", response.toString());
    int count = response.getPropertyCount();
    for (int i = 0; i < count; i++) {
        SoapObject result = (SoapObject) response.getProperty(i);
        DeleteuserDetails deleteuserDetails=new DeleteuserDetails();
        deleteuserDetails.setUserId(result.getPropertyAsString(4));
        deleteuserDetails.setUserName(result.getPropertyAsString(2));
        deleteuserDetails.setUserRole(result.getPropertyAsString(3));
        deleteuserDetails.setCreatedDate(result.getPropertyAsString(1));
        deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));
        userdetail.add(deleteuserDetails);
    }

现在deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));从Web服务获取了null值,因此我需要将其转换为字符串"null"

LogCat:

12-20 18:48:52.608: W/System.err(2174): java.lang.NullPointerException
12-20 18:48:52.608: W/System.err(2174):     at org.ksoap2.serialization.SoapObject.getPropertyAsString(SoapObject.java:165)
12-20 18:48:52.608: W/System.err(2174):     at com.mvss.admin.Deleteuser$deteUserIdLoad.doInBackground(Deleteuser.java:81)
12-20 18:48:52.608: W/System.err(2174):     at com.mvss.admin.Deleteuser$deteUserIdLoad.doInBackground(Deleteuser.java:1)
12-20 18:48:52.608: W/System.err(2174):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-20 18:48:52.608: W/System.err(2174):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-20 18:48:52.608: W/System.err(2174):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-20 18:48:52.608: W/System.err(2174):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
12-20 18:48:52.608: W/System.err(2174):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
12-20 18:48:52.608: W/System.err(2174):     at java.lang.Thread.run(Thread.java:1096)

1
deleteuserDetails.setCreatedBy(String.valueOf(result.getPropertyAsString(0)); 将把 null 转换为 "null"。 - assylias
2
这仍然会导致NPE。编写String.valueOf((Object)result.getPropertyAsString(0))可能会起作用。 - NickL
11个回答

34

不要捕获异常或添加条件,而是使用String.valueOf(result.getPropertyAsString(0));

它将调用参数的 toString() 方法并将其转换为字符串。如果 result.getPropertyAsString(0) 为空,则会将其更改为 "null"


9
虽然这不是一个好的实践方法,但你可以将 null 值与 "" 连接起来,以使其成为字符串。
例如:
String str=null;
System.out.println((str+"").length()); /// prints 4

这可能不是一个好的实践,我也不知道为什么它不是,但它确实是有效的、简单的、可靠的,并且似乎没有任何负面影响。虽然我可能主张 null 的字符串值应该是 ""。 - Keith Tyler

8

result.getPropertyAsString(0)单独使用,当属性在内部为空时就会导致NPE。您的堆栈跟踪指向SoapObject.getPropertyAsString(SoapObject.java:165),应该是:

public String getPropertyAsString(int index) {
    PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index);
    return propertyInfo.getValue().toString();
}

源代码 - 当propertyInfopropertyInfo.getValue()为空时,它将崩溃。

为了防止这种情况发生,您需要通过getProperty而不是getPropertyAsString获取属性,并手动将其转换为String

您可以将其封装到一些实用方法中。

public static String getPropertyAsString(SoapObject object, int index) {
    Object prop = object.getProperty(index);
    if(prop instanceof PropertyInfo) {
        prop = ((PropertyInfo)prop).getValue();
    }
    return String.valueOf(prop); // will make it "null" if it is null
}

然后执行

deleteuserDetails.setUserId(getPropertyAsString(result, getPropertyAsString(4)));
deleteuserDetails.setUserName(getPropertyAsString(result, getPropertyAsString(2)));
deleteuserDetails.setUserRole(getPropertyAsString(result, getPropertyAsString(3)));

http://stackoverflow.com/questions/13987579/illegalstateexception-in-android-tablelayout - Vivek Shankar

6
尝试这个:

deleteuserDetails.setCreatedBy(result.getPropertyAsString(0) == null ? "null": result.getPropertyAsString(0));

那么你仍然在getPropertyAsString上调用.toString()。但你不能这样做,因为如果getPropertyAsString返回null,则相当于调用null.toString()。 - NickL

6

使用此功能,

try {
    deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
catch(Exception e) {
    deleteuserDetails.setCreatedBy("null");
}

3
if(result.getPropertyAsString(0)==null)
{
deleteuserDetails.setCreatedBy("");
}
else
{
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}

3
你可以简单地检查它是否为空,然后为其设置一个字符串。
if(result.getPropertyAsString(0) == null){
 deleteuserDetails.setCreatedBy("NULL");
}else{
 deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));
}

3

"嗨,这将是 " + null;

在字符串中打印出"嗨,这将是null"


2

应该使用条件语句 if(String!=null),而不是之前的做法。


请您详细说明一下。 - Vivek Shankar
将条件设置为:if(result.getPropertyAsString(0).toString()!=null){deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());} - Avadhani Y
2
他的问题是getPropertyAsString == null,因此在其上调用.toString()将导致NPE。 - NickL
好的@NickL,然后将代码更改为:如果(result.getPropertyAsString(0)!=null){deleteuserDetails.setCreatedB‌​y(result.getPropertyAsString(0).toString());} - Avadhani Y
2
@Avadhani 如果仍然将NULL值转换为“null”字符串,则可以参考其他回答。 - NickL
显示剩余10条评论

0

借鉴@prateek的观点。

 String str=null;
    System.out.println((str+""));

不要使用 .length,这样你就可以直接打印字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接