2017-09-13 21 views
0

我对MVEL无效(?)操作符有疑问。MVEL Null-Safe操作符是否在方法上工作?

说我有下面的Java类:

public class Traveler { 

    private Set<String> visitedCountries; 

    public Set<String> getVisitedCountries() { 
     return visitedCountries; 
    } 
} 

如果我有一个MVEL表达这样的:

traveler.visitedCountries.contains("France") 

我得到了NullPointerException如果visitedCountries字段为空。为了解决这个问题,我可以使用空安全操作员:

traveler.?visitedCountries.contains("France") 

如果visitedCountries为null,则表达式的值为null,而不是抛出NPE的。

我的问题是这样的:null安全的操作符是否在方法调用上工作?例如:

traveler.getVisitedCountries().contains("France") 

将抛出一个NullPointerException如果getVisitedCountries()返回null。

但是如果我把无效操作符放进去会发生什么?如果字段visitedCountries为空,以下内容会做什么?

traveler.?getVisitedCountries().contains("France") 

回答

0

事实证明,表达

traveler.?getVisitedCountries().contains("France") 

不遵守空安全操作员。它会在这里评估为null。单元测试:

@Test 
public void testMVELNullSafeOnMethod() { 
    Traveler traveler = new Traveler(); 
    // traveler visitedCountries field is null 
    String expression = "traveler.getVisitedCountries().contains(\"France\")"; 
    Serializable exp = MVEL.compileExpression(expression); 
    Map<String, Object> map = new HashMap<String, Object>(); 
    map.put("traveler", traveler); 
    Boolean response = (Boolean) MVEL.executeExpression(exp, map); 
    assertTrue(response == null || !response); 
} 
相关问题