Java HashMap获取方法空指针异常

时间:2012-12-03 16:17:18

标签: java nullpointerexception hashmap

我的代码类似于以下内容: -

class A
{
  private HashMap<Character, Boolean> myMap;
  public A()
  {
    myMap = new HashMap<Character, Boolean>();
    String mychars = "asdfzxcvqwer";
    for ( char c : mychars.toCharArray() )
        myMap.put(c, true);
  }
  public doo(String input)
  {
    StringBuilder output = new StringBuilder();
    for ( char c : input.toCharArray() )
    {
      if ( myMap.get(c) )
         output.append(c);
    }
  }
  ...
  ...
}

我在第if ( myMap.get(c) )行得到一个空指针异常 - 我做错了什么?

9 个答案:

答案 0 :(得分:44)

如果c中未包含myMap,则会返回nullboolean无法取消装箱Boolean b = myMap.get(c); if(b != null && b){ ...

尝试:

{{1}}

答案 1 :(得分:11)

如果myMap不包含与c匹配的密钥,则myMap.get(c)将返回null。在这种情况下,当JVM将其期望为java.lang.Boolean对象的对象解压缩到boolean原语中以执行条件时,它会找到一个空对象,因此会抛出java.lang.NullPointerException

以下块与您的示例中的内容相同,并且应该更容易理解为什么会有NullPointerException

if (((Boolean) myMap.get(c)).booleanValue()) 

我会把你原来的条件重写为:

if ( myMap.containsKey(c) )

我希望这会有所帮助。

答案 2 :(得分:5)

更改

if ( myMap.get(c) )

if ( myMap.containsKey(c) && myMap.get(c))

答案 3 :(得分:3)

如果地图中没有必需Character的实体,则map.get(key)会返回null,而if语句会导致NullPointerException投掷。

答案 4 :(得分:3)

在黑暗中刺伤:地图中是否有分配给c的特定字符的条目?如果没有,Java可能会尝试将空值取消装箱......

答案 5 :(得分:3)

更改此

for ( char c : input.toCharArray() )
{
  if ( myMap.get(c) )
     output.append(c);
}

对于此

for ( char c : input.toCharArray() )
{
  if ( myMap.containsKey(c) )
     output.append(c);
}

将利用地图定义的方法来检查地图上是否已注册某个键。我要离开for,因为您似乎想要检查一组密钥。

myMap.get(c)会返回与该键相关联的值,如果未注册该键,则返回null

作为旁注,请记住,如果您将此方法用于自定义对象,则必须重新定义hashcodeequals方法。

建议:我只是想出一个我有的远程想法,如果它不是对你的代码的正确解释只是忽略它。如果你的地图只包含一个布尔值来确定某个值是否“包含”,我强烈建议你改用HashSet,因为地图在那个环境中没有任何意义。

答案 6 :(得分:2)

你的代码非常混乱。

  • do是保留关键字,请勿将其用作方法名称。
  • 一个'if'表达式必须返回一个布尔值,而不是null。
  • myMap的初始化未正确编写

这是一个工作版本:

import java.util.HashMap;

public class A {
    private HashMap<Character, Boolean> myMap;

    public A() {
        this.myMap = new HashMap<Character, Boolean>();
        String mychars = "asdfzxcvqwer";
        for ( char c : mychars.toCharArray() )
            myMap.put(c, true);
    }

    public String execute(String input) {
        StringBuilder output = new StringBuilder();
        for ( char c : input.toCharArray() )
        {
            if ( this.myMap.get(c) != null )
                output.append(c);
        }
        return output.toString();
    }


    public static void main(String[] args) {
        A test = new A();
        test.execute("abc");
    }
}

答案 7 :(得分:0)

或者,您可以使用apache.commons.lang3检查Boolean并处理null检查BooleanUtils.isTrue(c)

说明:

通常会引发NPE的混乱,即在地图上调用get()或执行if(...)时。

您的地图声明为:

myMap = new HashMap<Character, Boolean>();

其中包含原始boolean包装类Boolean作为映射条目的值。

操作时:

if (myMap.get(c))

myMapHashMap,当调用null时返回get(),因为映射中不存在某个键。 null然后解包到原语boolean,这是在您单独调用get()时抛出 NPE 的地方。

答案 8 :(得分:0)

就我而言,我只是用 catch 块处理它,就像这样:

@PostMapping("/findAllLastExecutedApi")
    public ResponseEntity<Map<String,List<Results>>>findAllLastExecuted(@RequestBody Map<String,String> uuids) {
        try{ 
            // NPE is triggered here : 
            if(uuids.get("demoId").isEmpty()) {
                Map<String,List<Results>> badResults= Collections.singletonMap("Invalid demoId provided, is empty",null);
                log.error("Invalid demoId provided, is empty {}",uuids);
                return  ResponseEntity.ok(badResults);
            }

            Map<String,List<Results>> results =
                    this.service.findAll(uuids.get("demoId"));
            return ResponseEntity.ok(results);

        }catch (NullPointerException e){
            log.error("Invalid demoId provided, is null {}",uuids);
            throw new NullPointerException("Invalid demoId provided , is null");
        }
    }