Android Webサービスからテーブル行に値をロードするプログラムを作成しました。ただし、値が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);
}
_
これで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)
_
これを使って、
try {
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
catch(Exception e) {
deleteuserDetails.setCreatedBy("null");
}
例外をキャッチしたり、条件を設定したりする代わりに、String.valueOf(result.getPropertyAsString(0));
を使用します
toString()引数のメソッドを呼び出してStringに変換し、result.getPropertyAsString(0)がnullの場合は"null"に変更します
result.getPropertyAsString(0)
だけでは、プロパティが内部的にnullの場合はすでにNPEになります。スタックトレースはSoapObject.getPropertyAsString(SoapObject.Java:165)
を指していますが、
_public String getPropertyAsString(int index) {
PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index);
return propertyInfo.getValue().toString();
}
_
ソース -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
}
_
そして次に
_deleteuserDetails.setUserId(getPropertyAsString(result, getPropertyAsString(4)));
deleteuserDetails.setUserName(getPropertyAsString(result, getPropertyAsString(2)));
deleteuserDetails.setUserRole(getPropertyAsString(result, getPropertyAsString(3)));
_
これを試して:
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0) == null ? "null": result.getPropertyAsString(0));
良い方法ではありませんが、null値を ""と連結して文字列にすることもできます。
例:
String str=null;
System.out.println((str+"").length()); /// prints 4
if(result.getPropertyAsString(0)==null)
{
deleteuserDetails.setCreatedBy("");
}
else
{
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
Nullかどうかを確認してから、文字列を設定できます。
if(result.getPropertyAsString(0) == null){
deleteuserDetails.setCreatedBy("NULL");
}else{
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));
}
その代わりに、条件if(String!=null)
を配置します。
"Hi this will be " + null;
文字列で「こんにちは、これはnullになります」を出力します
@prateekが言ったことをPiggybagに乗る。
String str=null;
System.out.println((str+""));
実際に文字列を出力できるように、.lengthなしでそれを行います
エラーは、null値を文字列に変換しようとしたときに発生します(ほとんどはBigDecimalです)。
したがって、プログラムがnullをStringに変換し、String変数にnull値を手動で設定しようとしたときに、例外をキャッチする必要があります。
try{
deleteuserDetails.setUserId(result.getPropertyAsString(4));
}catch (Exception e){
deleteuserDetails.setUserId(null);
}