如何迭代地图以避免NPE?

时间:2014-01-16 20:41:11

标签: java map nullpointerexception

我正在为传递给我的下方法的主机名生成一个URL基础。

UserIdClientId将始终通过,但DataMap有时会为空。这里的DataMap是StringString

如果NullPointerException为空,我的下面代码会抛出keys.getDataMap()

private String generateURL(final String hostIPAdress) {
    StringBuffer url = new StringBuffer();
    url.append("http://" + hostIPAdress + ":8080/user?userid=" + keys.getUserId() + "&client_id="
        + keys.getClientId());

    // this line throw NPE
    Set<Entry<String, String>> params = keys.getDataMap().entrySet();

    for (Entry<String, String> e : params) {
        url.append("&" + e.getKey());
        url.append("=" + e.getValue());
    }

    return url.toString();
}

如果只传递了UserIdClientIdDataMap为空,那么我会像这样制作网址 -

hostname:8080/user?userid=1234567&client_id=20

但是在上面的情况下,由于地图是空的,它正在抛出NPE。我该如何解决这个问题?

如果正在传递地图数据,那么我会像这样制作网址 -

hostname:8080/user?userid=1234567&client_id=20&attribute=testing

此处attribute是地图的关键,testing是该键的值。

3 个答案:

答案 0 :(得分:4)

只需检查您的地图是否为null

final Map dataMap = keys.getDataMap();
if (dataMap != null)
{
    Set<Entry<String, String>> params = dataMap.entrySet();
    // ...
}

答案 1 :(得分:4)

添加围栏:

Map dataMap= keys.getDataMap();
if (dataMap != null)
{
    Set<Entry<String, String>> params = dataMap.entrySet();
    // ...
}

确保在大括号中包含适当的逻辑,并在getDataMap()返回null时从函数返回一些合适的默认值。

答案 2 :(得分:1)

它抛出NPE不是因为它是空的,它是空的。一个简单的空检查应该做。 考虑:

private String generateURL( final String hostIPAdress ) {
    StringBuilder url = new StringBuilder();
    url.append( "http://" ).append( hostIPAdress )
        .append( ":8080/user?userid=" ).append( keys.getUserId() )
        .append( "&client_id=" ).append( keys.getClientId() );

    if( keys.getDataMap() == null ) {
        return url.toString();
    }

    for( Entry< String, String > e : keys.getDataMap().entrySet() ) {
        url.append( '&' ).append( e.getKey() ).append( '=' ).append( e.getValue() );
    }

    return url.toString();
}