Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >让JDA的公会老板提高NullPointerException

让JDA的公会老板提高NullPointerException
EN

Stack Overflow用户
提问于 2022-04-02 08:00:15
回答 1查看 144关注 0票数 0

我试着做一个函数来显示关于服务器的信息。

代码语言:javascript
运行
AI代码解释
复制
public static void serverInfo(Guild guild, MessageChannel channel) {
EmbedBuilder embed = new EmbedBuilder();

//Calculations
int people = 0;
int roles = 0;
int tc = 0;
int vc = 0;

for (Member member : guild.getMembers()) {
    if (!member.getUser().isBot())
        ++people;
}
for (Role ignored : guild.getRoles())
    ++roles;
for (TextChannel ignored : guild.getTextChannels())
    ++tc;
for (VoiceChannel ignored : guild.getVoiceChannels())
    ++vc;

String time = String.valueOf(guild.getTimeCreated());
String created = time.substring(8, 10) + "-" + time.substring(5, 7) + "-" + time.substring(0, 4);

embed.setTitle(guild.getName());
embed.setThumbnail(guild.getIconUrl());
embed.addField("Total Members", String.valueOf(guild.getMemberCount()+1), true);
embed.addField("Members", String.valueOf(people),true);
embed.addField("Bots", String.valueOf((guild.getMemberCount()+1)-people), true);
embed.addField("Owner", Objects.requireNonNull(guild.getOwner()).getUser().getName(), true);
embed.addField("Roles", String.valueOf(roles), true);
embed.addField("Text Channels", String.valueOf(tc), false);
embed.addField("Voice Channels", String.valueOf(vc), true);
embed.addField("Date Created", created, false);

channel.sendMessageEmbeds(embed.build()).queue();
}

但是,这会引发NullPointerException

java.base/java.util.Objects.requireNonNull(Objects.java:208)的java.lang.NullPointerException在com.television.CommandExecutor.onMessageReceived(CommandExecutor.java:19)的com.television.Commands.Infos.serverInfo(Infos.java:38)

但是,如果我从函数中删除了这个部分,它就能正常工作,也不会引发任何例外。

代码语言:javascript
运行
AI代码解释
复制
for (Member member : guild.getMembers()) {
        if (!member.getUser().isBot())
            ++people;
}

这一切为什么要发生?在我测试过的3台服务器中,只有1台服务器出现了这个问题。

其次,我知道这与标题中的问题没有多大关系,我如何计算成员/机器人的数量,因为这一部分(上面代码片段中的for-每个循环)没有正确计算成员数,它总是有1作为bot变量的值,因此成员数-1是人的值。

EN

回答 1

Stack Overflow用户

发布于 2022-04-04 09:20:27

提前两件事:您必须缓存来自每个公会的所有成员,或者在需要时(建议)检索它们。要做到这一点,您需要启用GUILD_MEMBERS特权意图。

您可以使用以下方法很容易地检索表示公会所有成员的列表:

代码语言:javascript
运行
AI代码解释
复制
public CompletableFuture<List<Member>> loadMembersFull(Guild guild) {
    CompletableFuture<List<Member>> future = new CompletableFuture<>();
    if (guild.isLoaded()) {
        future.complete(guild.getMembers());
    } else {
        guild.loadMembers()
            .onError(future::completeExceptionally)
            .onSuccess(future::complete);
    }
}

有了这些,你就可以继续做其他的事情了。实际上,我不知道为什么它没有for-循环就能工作,但是看起来错误并不发生在那里,而是在加载所有者时,因为它会将异常抛到您的#requireNonNull中。当所有者对象不再在公会中或尚未加载时,该所有者对象为空。所有者也可以删除帐户或被禁止的不和谐。为了解决这个问题,我建议您将您的行替换为以下一行:

代码语言:javascript
运行
AI代码解释
复制
embed.addField("Owner", Optional.ofNullable(guild.getOwner()).map(owner -> owner.getUser().getName()).orElse("<not found>"), true);

要获得适当数量的用户,您应该筛选用户列表,以确定他们是否是机器人。

代码语言:javascript
运行
AI代码解释
复制
int amount = (int) loadMembersFull(guild).join().stream()
    .map(Member::getUser)
    .filter(user -> !user.isBot())
    .count();

如果你需要更多的帮助,可以在我的不和谐服务器上问我

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71719101

复制
相关文章
在docker中安装phpmyadmin
其中,PMA_HOST和PMA_PORT填写的内容是MySQL数据库的地址和端口号
灯珑LoGin
2022/10/31
2.1K0
如何在 Go 中优雅的处理和返回错误(1)——函数内部的错误处理
在使用 Go 开发的后台服务中,对于错误处理,一直以来都有多种不同的方案,本文探讨并提出一种从服务内到服务外的错误传递、返回和回溯的完整方案,还请读者们一起讨论。
amc
2021/09/18
9.6K0
如何在 Go 中优雅的处理和返回错误(1)——函数内部的错误处理
python查询mysql,返回json
import MySQLdb import json def getSql(): try: con = MySQLdb.connect(host='localhost', user='', passwd='', db='test', charset='utf8') cursor = con.cursor() sql = "select * from user" cursor.execute(sql)
py3study
2020/01/10
3.7K0
phpMyAdmin错误提示解决
有些朋友打开phpMyAdmin出现这个的原因是 phpMyAdmin的安装目录, tmp目录不存在,或者存在但是权限不对,这是缓存目录,可以加快phpMyAdmin的运行,不会影响程序执行,就是强迫症看着受不了吧 。
煎饼
2022/12/13
2.6K0
MySQL 在查询结果中记录行号
在其他的关系型数据库中,都有rownum这类型的内置函数来提供查询结果的行号,但是MySQL没有,阿福也一直觉得奇怪。
用户2353021
2020/05/09
6.9K0
【Laravel系列7.2】错误与异常处理
在学习完 Laravel 中的日志处理模块之后,接下来马上就进入到错误和异常的学习中。其实通过之前 PHP 基础相关的学习,我们已经了解到 PHP7 中的大部分错误都已经可以通过异常来进行处理了,而我们的 Laravel 框架,基本全是通过异常来进行处理的。
硬核项目经理
2023/03/03
2.9K0
【Laravel系列7.2】错误与异常处理
Laravel Exceptions——异常与错误处理
本文 GitBook 地址:https://legacy.gitbook.com/book/leoyang90/laravel-source-analysis/details
码农编程进阶笔记
2021/07/20
2.1K0
Laravel Exceptions——异常与错误处理
解决Mysql在查询时报:1055分组查询错误的解决方法
如果是Linux,就在配置文件(my.cnf)中修改 sql_mode 的配置(在/etc/my.cnf路径下)。如果是Windows,就修改配置文件my.ini,我的是Windows,如下所示:
星辰sea
2022/10/29
1.3K0
解决Mysql在查询时报:1055分组查询错误的解决方法
点击加载更多

相似问题

phpMyAdmin查询窗口中MySQL中IF语句返回错误

10

原始查询在phpmyadmin上有效,但在laravel上无效

20

Mysql查询显示phpmyadmin中的错误

29

MySQL查询运行在phpMyAdmin中,而不是在Laravel中。

11

MySQL查询缺少在phpMyAdmin中返回的节点-mysql中的结果

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档