J'ai écrit un programme Android pour charger des valeurs dans la table-ligne à partir du service Web. Mais la valeur est nulle, donc je dois la convertir en chaîne. Quelqu'un peut-il me dire la méthode pour le faire?
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);
}
Maintenant, deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));
obtient une valeur nulle du webservice, j'ai donc besoin de la convertir en chaîne "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)
Utilisez ceci,
try {
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
catch(Exception e) {
deleteuserDetails.setCreatedBy("null");
}
Au lieu d'attraper l'exception ou de mettre des conditions, utilisez String.valueOf(result.getPropertyAsString(0));
Il appellera la méthode toString () de l'argument et le convertira en String et si result.getPropertyAsString (0) est nul, alors il le changera en "null"
result.getPropertyAsString(0)
seul entraînera déjà un NPE lorsque la propriété est nullement interne. Votre stacktrace pointe vers SoapObject.getPropertyAsString(SoapObject.Java:165)
qui devrait être
public String getPropertyAsString(int index) {
PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index);
return propertyInfo.getValue().toString();
}
source - il plantera lorsque propertyInfo
ou propertyInfo.getValue()
est null
.
Pour éviter cela, vous devez obtenir la propriété non via getPropertyAsString
mais via getProperty
et la convertir manuellement en String
.
Vous pouvez l'encapsuler dans une méthode utilitaire
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
}
puis faire
deleteuserDetails.setUserId(getPropertyAsString(result, getPropertyAsString(4)));
deleteuserDetails.setUserName(getPropertyAsString(result, getPropertyAsString(2)));
deleteuserDetails.setUserRole(getPropertyAsString(result, getPropertyAsString(3)));
Essaye ça:
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0) == null ? "null": result.getPropertyAsString(0));
Bien que ce ne soit pas une bonne pratique, vous pouvez toutefois concaténer la valeur nulle avec "" pour en faire une chaîne.
Par exemple:
String str=null;
System.out.println((str+"").length()); /// prints 4
if(result.getPropertyAsString(0)==null)
{
deleteuserDetails.setCreatedBy("");
}
else
{
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0).toString());
}
Vous pouvez simplement vérifier si son null puis définir une chaîne pour lui.
if(result.getPropertyAsString(0) == null){
deleteuserDetails.setCreatedBy("NULL");
}else{
deleteuserDetails.setCreatedBy(result.getPropertyAsString(0));
}
Au lieu de cela, placez la condition if(String!=null)
.
"Hi this will be " + null;
Imprime "Salut, ce sera nul" dans la chaîne
à Piggybag rouler sur ce que @prateek a dit.
String str=null;
System.out.println((str+""));
Faites-le sans la longueur pour pouvoir simplement imprimer la chaîne
L'erreur survient lorsque vous essayez de convertir une valeur nulle en une chaîne (généralement c'est BigDecimal)
Donc, ce que vous devez faire est d'attraper l'exception lorsque le programme essaie de convertir null en String et de définir manuellement la valeur null pour la variable String.
try{
deleteuserDetails.setUserId(result.getPropertyAsString(4));
}catch (Exception e){
deleteuserDetails.setUserId(null);
}