Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NullPointerException in DefaultShardManager #2049

Open
3 tasks done
Pringlers opened this issue Mar 1, 2022 · 3 comments
Open
3 tasks done

NullPointerException in DefaultShardManager #2049

Pringlers opened this issue Mar 1, 2022 · 3 comments

Comments

@Pringlers
Copy link

Pringlers commented Mar 1, 2022

General Troubleshooting

  • I have checked for similar issues.
  • I have updated to the latest JDA version.
  • I have checked the branches or the maintainers' PRs for upcoming bug fixes.

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
Copy link
Author

Pringlers commented Mar 1, 2022

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
Copy link
Contributor

Andre601 commented Mar 1, 2022

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
Copy link
Author

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants