Jackson ObjectMapper.readValue 抛出 NullPointerException,LRUMap.get(LRUMap.java:68)

问题描述 投票:0回答:1

我编写了一个 Hive UDF,如下所示:

public class DemoUDF extends GenericUDF{
      private ObjectMapper mapper = new ObjectMapper();
      
      ... initialize() method...

      public Object evaluate(DeferredObject[] deferredObjects) throws HiveException{
           ... ...
           ActionVO vo = mapper.readValue(target_str, ActionVO.class);
           ... ...
      }
}

当我将此函数添加到配置单元中,并通过一些查询执行它时,存在以下异常:

引起:java.lang.NullPointerException 在 com.fasterxml.jackson.databind.util.LRUMap.get(LRUMap.java:68) 在 com.fasterxml.jackson.databind.type.TypeFactory._fromClass(TypeFactory.java:1255) 在 com.fasterxml.jackson.databind.type.TypeFactory._fromAny(TypeFactory.java:1194) 在 com.fasterxml.jackson.databind.type.TypeFactory.constructType(TypeFactory.java:608)

当我将 ObjectMapper 声明更改为下面时,它工作正常!

private static final ObjectMapper mapper = new ObjectMapper();

那为什么呢?有什么效果?

jackson fasterxml
1个回答
0
投票

我认为一旦你将一个变量设置为静态,那么它的类级别的东西就会被存储,并且只会存储它的一个副本。 JVM 在类加载期间分配静态变量。对于非静态实例,将根据类实例创建多个副本,因此需要更多内存。 静态变量由类的所有对象共享,并且具有单个实例,而非静态变量对于每个对象来说都是唯一的,并且对于不同的对象具有不同的值。

© www.soinside.com 2019 - 2024. All rights reserved.