tastybento / ASkyBlock-Bugs-N-Features

Bug Tracker for ASkyBlock and AcidIsland - note team is 100% working on next version BentoBox
6 stars 3 forks source link

ASkyBlockAPI.getInstance(); returns null #513

Closed AuroraLS3 closed 6 years ago

AuroraLS3 commented 6 years ago

Exception present in version 3.0.8 Not present in prior versions

I have a code that gets the API at one point in the enable of my plugin (ASkyBlock is a soft dependency in the plugin.yml):

ASkyBlockAPI api = ASkyBlockAPI.getInstance();
addPluginDataSource(new ASkyBlockIslandLevel(api));

Exception occurs when a method of this new object is called:

    @Override
    public Serializable getValue(UUID uuid) {
        if (api.hasIsland(uuid)) {  <-- NullPointerException
            return api.getIslandLevel(uuid);
        }
        return -1;
    }

UUID given to the method can not be null so api has to be null. api is defined in the constructor:

    public ASkyBlockIslandLevel(ASkyBlockAPI aaAPI) {
        super("ASkyBlock", "island_level", AnalysisType.INT_AVG);
        this.api = aaAPI;
    }

This means that ASkyBlockAPI.getInstance(); returns null in version 3.0.8

Exception for good measure:

PluginData-source caused an exception: ${ASkyBlock_island_level} Caught java.lang.NullPointerException
  com.djrapitops.pluginbridge.plan.askyblock.ASkyBlockIslandLevel.getValue(ASkyBlockIslandLevel.java:44)
  java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
  java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1548)
  java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
  java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
  java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
  java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
  java.util.stream.IntPipeline.collect(IntPipeline.java:472)
  java.util.stream.IntPipeline.average(IntPipeline.java:434)
  main.java.com.djrapitops.plan.utilities.analysis.MathUtils.averageInt(MathUtils.java:32)
  main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils.getAverage(AnalysisUtils.java:110)
  main.java.com.djrapitops.plan.utilities.analysis.Analysis.lambda$analyzeAdditionalPluginData$3(Analysis.java:196)
  java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
  java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
  java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
  java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
  java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291)
  java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
  java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
  java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
  java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
  java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

Related classes:

AntoninHuaut commented 6 years ago

I have the same problem.

tastybento commented 6 years ago

Okay, strange. There was a change made to actually avoid a null object. I’ll look into it.

tastybento commented 6 years ago

Please try https://github.com/tastybento/askyblock/releases/tag/V3.0.8.1a and let me know if that works for you. It was a timing issue around when I was initializing the API instance. I now make sure it's done in onEnable so that it's available immediately.

AntoninHuaut commented 6 years ago

Working

tastybento commented 6 years ago

Thanks!