discord-jda / JDA

Java wrapper for the popular chat & VOIP service: Discord https://discord.com
Apache License 2.0
4.29k stars 739 forks source link

NullPointerException in DefaultShardManager #2049

Open Pringlers opened 2 years ago

Pringlers commented 2 years ago

General Troubleshooting

Bug Report

NullPointerException is thrown when adding event listener via ShardManager#addEventListener

Expected Behavior

Adds event listener as usual

Code Example or Reproduction Steps

Note: ShardManager should not be logged in yet

val shardManager = DefaultShardManagerBuilder.createDefault(token).build(false)
shardManager.addEventListener(EventListener) // Exception thrown here
shardManager.login()

Code for JDABuilder or DefaultShardManagerBuilder Used

val shardManager = DefaultShardManagerBuilder.createDefault(token).build(false)

Exception or Error

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "net.dv8tion.jda.api.utils.cache.ShardCacheView.forEach(java.util.function.Consumer)" because the return value of "net.dv8tion.jda.api.sharding.ShardManager.getShardCache()" is null
    at net.dv8tion.jda.api.sharding.ShardManager.addEventListener(ShardManager.java:71)
Pringlers commented 2 years ago

Looks like it's because DefaultShardManager's constructor does not initialize this.shards when shardsTotal is not explicitly set. Then I access this.shardCache, which is initialized when shardsTotal is set, by DefaultShardManagerBuilder#build(boolean): ShardManager > DefaultShardManager#login() > DefaultShardManager#buildInstance(int).

Though, looks like the method registers event listeners to the running shards, so it might not be intended usage

Andre601 commented 2 years ago

Is there a reason you call build(false)?

You could add event listeners in the builder and then build it.

ShardManager shardManager = DefaultShardManagerBuilder.create(token)
    .addEventListeners(new Clazz())
    .build();
Pringlers commented 2 years ago

I wanted to pass ShardManager to init something, and login when the other things are ready. Yes, I can pass builder around, but I'm reporting so it can be documented or fixed (if it should work)