Viv*_*kar 12 java android nullpointerexception
我编写了一个android程序,用于从Web服务向tablerow加载值.但是一个值为null,所以我需要将它转换为字符串.有人可以告诉我这样做的方法.
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);
}
Run Code Online (Sandbox Code Playgroud)
现在deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));从webservice获取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)
Run Code Online (Sandbox Code Playgroud)
小智 23
而不是捕获异常或放置条件,使用 String.valueOf(result.getPropertyAsString(0));
它将调用参数的toString()方法并将其转换为String,如果result.getPropertyAsString(0)为null,则将其更改为"null"
result.getPropertyAsString(0)当属性内部为null时,单独将导致NPE.你的stacktrace指向SoapObject.getPropertyAsString(SoapObject.java:165)应该是什么
public String getPropertyAsString(int index) {
PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index);
return propertyInfo.getValue().toString();
}
Run Code Online (Sandbox Code Playgroud)
源 -什么时候会崩溃propertyInfo或者
propertyInfo.getValue()是null.
为了防止这种情况发生,您需要获取属性,而不是通过getPropertyAsString并通过getProperty手动将其转换为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
}
Run Code Online (Sandbox Code Playgroud)
然后呢
deleteuserDetails.setUserId(getPropertyAsString(result, getPropertyAsString(4)));
deleteuserDetails.setUserName(getPropertyAsString(result, getPropertyAsString(2)));
deleteuserDetails.setUserRole(getPropertyAsString(result, getPropertyAsString(3)));
Run Code Online (Sandbox Code Playgroud)
用这个,
try {
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
catch(Exception e) {
deleteuserDetails.setCreatedBy("null");
}
Run Code Online (Sandbox Code Playgroud)
小智 5
试试这个:
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0) == null ? "null": result.getPropertyAsString(0));
Run Code Online (Sandbox Code Playgroud)
尽管这不是一个好习惯,但是您可以将空值与“”连接起来,使其成为字符串。
例如:
String str=null;
System.out.println((str+"").length()); /// prints 4
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52725 次 |
| 最近记录: |