web-dev-qa-db-ja.com

nullオブジェクトを文字列に変換

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)
_
13
Vivek Shankar

これを使って、

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

例外をキャッチしたり、条件を設定したりする代わりに、String.valueOf(result.getPropertyAsString(0));を使用します

toString()引数のメソッドを呼び出してStringに変換し、result.getPropertyAsString(0)がnullの場合は"null"に変更します

26
Prashant K

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)));
_
8
zapl

これを試して:

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

良い方法ではありませんが、null値を ""と連結して文字列にすることもできます。

例:

    String str=null;
    System.out.println((str+"").length()); /// prints 4
5
Prateek
if(result.getPropertyAsString(0)==null)
{
deleteuserDetails.setCreatedBy("");
}
else
{
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
3

Nullかどうかを確認してから、文字列を設定できます。

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

その代わりに、条件if(String!=null)を配置します。

2
Avadhani Y

"Hi this will be " + null;

文字列で「こんにちは、これはnullになります」を出力します

2
HannahCarney

@prateekが言ったことをPiggybagに乗る。

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

実際に文字列を出力できるように、.lengthなしでそれを行います

0
krotsch

エラーは、null値を文字列に変換しようとしたときに発生します(ほとんどはBigDecimalです)。

したがって、プログラムがnullをStringに変換し、String変数にnull値を手動で設定しようとしたときに、例外をキャッチする必要があります。

try{
    deleteuserDetails.setUserId(result.getPropertyAsString(4));
}catch (Exception e){
    deleteuserDetails.setUserId(null);
}
0