2017-10-04 2 views
0

Je cherche à remplir un objet avec des valeurs d'un objet xml complexe. Pour arriver à la bonne valeur je dois passer à travers une grande chaîne d'éléments et je dois les vérifier tous pour ne pas être nul. Donc, mon code ressemblera à ceci X 9 fois. Je ne veux pas arrêter le processus de remplissage juste parce qu'un élément est manquant, je veux sauter le pointeur null en quelque sorte et arriver à la prochaine propriété. Ma seule idée est de mettre chaque ligne dans un bloc try/catch. Vous avez de meilleures idées? MerciLa meilleure façon d'autoriser une annonce d'exception de pointeur nul est de la corriger

objModel.setProviderHeadquarterName(obj.getObject("YYY") != null && obj.getObject("YYY").getArray("gob") != null && obj.getObject("YYY").getArray("gob").size() > 0 && obj.getObject("YYY").getArray("gob") != null ? obj.getObject("YYY").getArray("gob").getObject(0).getString("gobValue") : ""); 
objModel.setProviderHeadquarterName(obj.getObject("XXX") != null && obj.getObject("XXX").getArray("tem") != null && obj.getObject("XXX").getArray("tem").size() > 0 && obj.getObject("XXX").getArray("tem") != null ? obj.getObject("XXX").getArray("tem").getObject(0).getString("temValue") : ""); 
objModel.setProviderHeadquarterName(obj.getObject("ZZZ") != null && obj.getObject("ZZZ").getArray("has") != null && obj.getObject("ZZZ").getArray("has").size() > 0 && obj.getObject("ZZZ").getArray("has") != null ? obj.getObject("ZZZ").getArray("has").getObject(0).getString("hasValue") : ""); 

Comment

+3

N'écrivez pas ce code. Si votre objet XML ne peut pas tolérer les valeurs NULL, ne les autorisez pas à les ajouter à la collection. XML est une représentation hiérarchique des données, donc la récursivité devrait être votre ami. – duffymo

+0

Copie possible de https://stackoverflow.com/questions/271526/avoiding-null-statements. – VGR

Répondre

0

Pour répondre à votre question littéralement, vous pouvez extraire que dans une méthode distincte et attraper les exceptions potentielles. Mais ce n'est pas la meilleure pratique:

private static Object getValueOrNull(Supplier<Object> s) { 
    try { 
    return s.get(); 
    } catch (Exception e) { //narrow down the exception if possible 
    return null; 
    } 
} 

que vous pouvez appeler comme celui-ci (la valeur peut être null):

Object value = getValueOrNull(() -> obj.getObject("YYY").getArray("gob").getObject(0).getString("gobValue")); 
+0

Je voudrais vraiment seulement attraper le NPE dans ce cas. Facile à avaler d'autres exceptions que nous devons réellement gérer. –

+0

@JoeC Je pense que le code peut également lancer ArrayIndexOutOfBoundsException. Donc je l'ai gardé large et ai mis un commentaire dans le code en disant que le type d'exception devrait être réduit si possible. – assylias

4

Vous pouvez envelopper cela dans un Optional et traiter les nulls implicitement:

Optional.of(obj).map(o -> o.getObject("YYY")).map(o -> o.getArray("gob")) /* [snip] */ 
     .orElse(""); //etc 
+2

Ou 'Optional.ofNullable (obj.getObject (" YYY ")) ...' – Bohemian

+0

Cela fonctionne tout aussi bien. –

0

Merci pour vos gars d'entrée, ça marche!