在下面的代码段中,我使用for-each loop
在列表上进行迭代,并在性能测试服务器上遇到null
个值,其中包含数千个线程并登录用户。
List<Attribute> attributes = getRoleListAttributes();
Map<String, String> rolesAttribute = new HashMap<String, String>();
//Doing Null Check to be on safer side
if( attributes != null && !attributes.isEmpty() )
{
for( Attribute attr : attributes )<------ Here getting attr as null
{
if( attr != null && attr.getApiAlias() != null && attr.getInternalName() != null )
{
rolesAttribute.put( attr.getApiAlias(), attr.getInternalName() );
}
else
{ // In Server logs i am getting this error.
LOGGER.error("Invalid Role Attribute (%s)",attr);
}
}
}
当List<Attribute> attributes
实际包含null但我也在getRoleListAttributes();
getRoleListAttributes方法的实现:
public List<Attribute> getRoleListAttributes()
{
if( _apiEnabled == null )
{
if( _attributes != null && !_attributes.isEmpty() )
{
_validRoles = new ArrayList<Attribute>();
for( String attrInternalName : _attributes.keySet() )
{
Attribute attr = _attributes.get( attrInternalName );
if( attr != null )
{
if( attr.getApiAlias() != null && attr.getApiAlias().trim().length() > 0 )
{
_validRoles.add( attr );
}
}
}
}
}
return _apiEnabled;
}
我无效检查无处可在 rolesAttribute List
中输入null。
我唯一的疑问是在第一种方法中遍历List时有可能one thread
在getRoleListAttributes()方法中,而_validRoles
ArrayList开始从它的初始容量调整自身大小并且在第一个方法的同一时刻thread-1
接收空值。
一般情况下,如果在列表尝试调整自身大小时在ArrayList上调用get(object)
会发生什么。吗