Java netflix hystrix库中出现空指针异常

Java netflix hystrix库中出现空指针异常,java,nullpointerexception,hystrix,netflix,Java,Nullpointerexception,Hystrix,Netflix,最近我开始在netflix hystrix图书馆工作。我创建了一个HystrixCommand对象,但得到了一个NPE。理想情况下,这不应该发生。任何帮助都将不胜感激。这是一个已知的问题吗 请查找堆栈跟踪: Exception in thread "main" java.lang.NullPointerException at com.netflix.config.ConcurrentMapConfiguration.clearConfigurationListeners(Concurr

最近我开始在netflix hystrix图书馆工作。我创建了一个HystrixCommand对象,但得到了一个NPE。理想情况下,这不应该发生。任何帮助都将不胜感激。这是一个已知的问题吗

请查找堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
    at com.netflix.config.ConcurrentMapConfiguration.clearConfigurationListeners(ConcurrentMapConfiguration.java:330)
    at org.apache.commons.configuration.event.EventSource.<init>(EventSource.java:76)
    at org.apache.commons.configuration.AbstractConfiguration.<init>(AbstractConfiguration.java:63)
    at com.netflix.config.ConcurrentMapConfiguration.<init>(ConcurrentMapConfiguration.java:68)
    at com.netflix.config.ConcurrentCompositeConfiguration.<init>(ConcurrentCompositeConfiguration.java:172)
    at com.netflix.config.ConfigurationManager.getConfigInstance(ConfigurationManager.java:125)
    at com.netflix.config.DynamicPropertyFactory.getInstance(DynamicPropertyFactory.java:263)
    at com.netflix.config.DynamicProperty.getInstance(DynamicProperty.java:245)
    at com.netflix.config.PropertyWrapper.<init>(PropertyWrapper.java:58)
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$ArchaiusDynamicProperty.<init>(HystrixDynamicPropertiesArchaius.java:62)
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$StringDynamicProperty.<init>(HystrixDynamicPropertiesArchaius.java:73)
    at com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius.getString(HystrixDynamicPropertiesArchaius.java:34)
    at com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementationViaProperties(HystrixPlugins.java:344)
    at com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementation(HystrixPlugins.java:334)
    at com.netflix.hystrix.strategy.HystrixPlugins.getPropertiesStrategy(HystrixPlugins.java:243)
    at com.netflix.hystrix.strategy.properties.HystrixPropertiesFactory.getCommandProperties(HystrixPropertiesFactory.java:62)
    at com.netflix.hystrix.AbstractCommand.initCommandProperties(AbstractCommand.java:204)
    at com.netflix.hystrix.AbstractCommand.<init>(AbstractCommand.java:163)
    at com.netflix.hystrix.HystrixCommand.<init>(HystrixCommand.java:61)
线程“main”java.lang.NullPointerException中的异常 位于com.netflix.config.ConcurrentMapConfiguration.clearConfigurationListeners(ConcurrentMapConfiguration.java:330) 位于org.apache.commons.configuration.event.EventSource。(EventSource.java:76) 位于org.apache.commons.configuration.AbstractConfiguration.(AbstractConfiguration.java:63) 位于com.netflix.config.ConcurrentMapConfiguration。(ConcurrentMapConfiguration.java:68) 位于com.netflix.config.ConcurrentCompositeConfiguration。(ConcurrentCompositeConfiguration.java:172) 在com.netflix.config.ConfigurationManager.getConfigInstance(ConfigurationManager.java:125)上 位于com.netflix.config.DynamicPropertyFactory.getInstance(DynamicPropertyFactory.java:263) 位于com.netflix.config.DynamicProperty.getInstance(DynamicProperty.java:245) 位于com.netflix.config.PropertyWrapper.(PropertyWrapper.java:58) 在com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$archaiusdynamicpropertiesarchaius.java:62) 在com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius$stringdynamicproperties上(HystrixDynamicPropertiesArchaius.java:73) 在com.netflix.hystrix.strategy.properties.archaius.HystrixDynamicPropertiesArchaius.getString上(HystrixDynamicPropertiesArchaius.java:34) 位于com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementationViaProperties(HystrixPlugins.java:344) 位于com.netflix.hystrix.strategy.HystrixPlugins.getPluginImplementation(HystrixPlugins.java:334) 在com.netflix.hystrix.strategy.HystrixPlugins.getPropertiesStrategy上(HystrixPlugins.java:243) 位于com.netflix.hystrix.strategy.properties.HystrixPropertiesFactory.getCommandProperties(HystrixPropertiesFactory.java:62) 位于com.netflix.hystrix.AbstractCommand.initCommandProperties(AbstractCommand.java:204) 位于com.netflix.hystrix.AbstractCommand。(AbstractCommand.java:163) 在com.netflix.hystrix.HystrixCommand上(HystrixCommand.java:61)
我遇到了类似的问题,下面是我如何解决的

Hystrix->使用archaius-core-0.4.1.jar->它使用commons-configuration-1.8.jar

但由于我当前项目中的jar冲突,出现了commons-configuration-1.3.jar而不是commons-configuration-1.8.jar

不幸的是,在org.apache.commons.configuration.event.EventSource的构造函数中,commons-configuration-1.3.jar中似乎有一个错误(我将在下面解释)

因此,我的建议是查看您的类路径,我相信您会找到commons-configuration-1.3.jar。如果是这样,只需确保您拥有正确的commons-configuration-1.8.jar。这应该能解决你的问题

根本原因:

com.netflix.config.ConcurrentMapConfiguration->是 org.apache.commons.configuration.AbstractConfiguration->是org.apache.commons.configuration.event.EventSource的一个子类

这是骨架

public class ConcurrentMapConfiguration extends AbstractConfiguration {
   ...
   private Collection<ConfigurationListener> listeners = new CopyOnWriteArrayList<ConfigurationListener>();    
   ...
   public ConcurrentMapConfiguration() {
      ...
   }
   ...
   @Override
   public void clearConfigurationListeners() {
       listeners.clear();  // Here is the null pointer exception
   }
   ...
}
正如您在EventSource的构造函数中清楚地看到的,您看到了对方法clearConfigurationListeners()的调用。并且该方法已在子类ConcurrentMapConfiguration中重写。因此,将调用子类方法。但此时监听器仍然为null,因为只有在完成了超类构造函数之后,子类才能开始初始化它的内容。因此,NPE

但在EventSource(commons-configuration-1.4.jar及更高版本)中,它是固定的

public class EventSource {
   ...
   public EventSource()
   {
       initListeners(); // this is good
   }
   ...
   private void initListeners() // private method... Much better! No one can override this :)
   {
       listeners = new LinkedList();
       ...
   }
   ...
}
希望这有帮助

public class EventSource {
   ...
   public EventSource()
   {
       initListeners(); // this is good
   }
   ...
   private void initListeners() // private method... Much better! No one can override this :)
   {
       listeners = new LinkedList();
       ...
   }
   ...
}