首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >让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

复制
相关文章
(三)dict哈希结构1
昨天分析完adlist的Redis代码,今天马上马不停蹄的继续学习Redis代码中的哈希部分的结构学习,不过在这里他不叫什么hashMap,而是叫dict,而且是一种全新设计的一种哈希结构,他只是通过几个简单的结构体,再搭配上一些比较常见的哈希算法,就实现了类似高级语言中HashMap的作用了。也让我见识了一些哈希算法的实现,比如dbj hash的算法实现,俗称times33,算法,就是不停的*33,。这种算是一种超级简单的哈希算法。 下面说说给我感觉Redis代码中哈希实现的不是那么简单
范蠡
2018/04/13
7640
(三)dict哈希结构1
list、dict和set的综合应用:排课系统(1)
我们都知道一个程序从本质上来说就是算法+数据结构,这次就以我的本科毕业设计——排课系统为例,专门讲解如何设计排课的算法和要用到的数据结构,在讲解这个算法之前,我们今天先做一些准备工作。
不可言诉的深渊
2020/06/16
1.3K3
list、dict和set的综合应用:排课系统(1)
[零基础学Python]dict()的
dict的很多方法跟list有类似的地方,下面一一道来,并且会跟list做一个对比
py3study
2020/01/03
4970
python dict
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
py3study
2020/01/09
4170
java executeupdate,为什么executeUpdate(sql)返回-1呢
public void setUserName(String userName) {
全栈程序员站长
2022/11/01
6210
java executeupdate,为什么executeUpdate(sql)返回-1呢
python字典dict方法_python中dict的用法
Python字典是另一种可变容器模型,可存储任意类型对象。如字符串、数字、元组等其他容器模型 因为字典是无序的所以不支持索引和切片。
全栈程序员站长
2022/11/08
1.2K0
python字典dict方法_python中dict的用法
python dict常用
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details/78806792
bear_fish
2018/09/14
5730
Python -- dict 类
    def clear(self):  #清除字典中所有元素形成空字典,del是删除整个字典;
py3study
2020/01/13
4930
Python 字典 dict
有时候为了方便起见,就算某个键在映射里不存在,我们也希望在通过 这个键读取值的时候能得到一个默认值。有两个途径能帮我们达到这个目的,一个是通过 defaultdict,这个类型而不是普通的 dict,另一个 是给自己定义一个 dict 的子类,然后在子类中实现 __missing__ 方法。
为为为什么
2022/08/09
8300
Python 字典 dict
load_state_dict(state_dict, strict=True)
load_state_dict(state_dict, strict=True)[source]
狼啸风云
2022/08/20
5680
Python 合并 dict
Python 两个或多个字典(dict)合并(取字典并集) 1、 Python 3.9.0 或更高版本使用| x = {'C': 11, 'Java': 22} y = {'Python': 33, 'CJavaPy': 44} z = x | y print(z) 注意:TypeError: unsupported operand type(s) for |: 'dict' and 'dict' 这个错误原因是Python是Python 3.9.0之前版本,不支持这个语法。 2、Python 3.5 或更
chuchur
2022/10/25
8040
python 字典dict
前面的课程讲解了字符串str/列表list/元组tuple,还有最后一种比较重要的数据类型也需要介绍介绍,那就是python字典,俗称:dict.
猿说编程[Python和C]
2020/02/26
1.3K0
python 字典dict
python基础—dict
d = dict(((1,‘a’),(2,‘b’))) d {1: ‘a’, 2: ‘b’}
dogfei
2020/07/31
4880
python 字典dict
# -*- coding: utf-8 -*- # ****************************** 创建 *************************** dict1 = {} #定义1个元素的字典 dict2 = {'pi': 3.14} print(dict2)  #{'pi': 3.14} dict3 = {1: 2} print(dict3)  #{1: 2} dict4 = dict([[1, 2], ('a', 'b')]) print(dict4)  #{'a': 
py3study
2020/01/13
4940
变量类型-Dict
教程: 一:字典的创建     1:字典的介绍------>d = {key1:value1, key2:values2}     (1)dictionary(字典) 是 Python 中最有用的数据类型。字典是无序的对象集合     (2)字典当中的元素是通过键来存取的,而不是通过偏移存取。     (3)字典是一种映射类型,它是一个无序的键(key) : 值(value)对集合。     (3)和字符串一样,list可以被索引和切片     (4)键(key)必须使用不可变类型。必须是唯一的     此处高能:不可变类型-----数字,字符串,元组,     2:字典的创建     (1)使用花括号         dict={key1:value1, key2:values2}         或者d = dict{},再添加相应的元素 !     (2)使用内联函数dict()         d = dict() 二:字典的索引     根据key即键值可以直接访问字典中的元素     使用get函数     如果用没有的键值访问字典,会出现什么情况呢!? 三:字典的修改     对列表中的数据项进行修改或者更新     d[key]= value     d1.update(d2) 四:字典的删除     del d['key']    删除键值     d.clear()    清空字典     del d        删除字典 五:字典内置函数     len(dict)----键的总数     d.keys()-------输出所有的键     d.values()-----输出所有的值     d.get(key)-----得到键对饮的值     d1.update(d2)--把d2的键和值更新到d1中     d.pop(key)-----删除key对应的元素 CODE: # -----------------------------------------------------------------------------------------------------# # 字典的创建方法一 # -----------------------------------------------------------------------------------------------------# my_dict1 = {'Name': 'faith', 'age': '100', 'grade': '80', 'hobby': 'basketball'} print('my_Dict1', my_dict1) my_dict2 = {}       # 注意这里的报错??? my_dict2['one'] = "this is the first value!" my_dict2[2] = "this is the second value!" my_dict2['3'] = "python" print('my_dict2', my_dict2) # -----------------------------------------------------------------------------------------------------# # 字典的创建方法二---------解决上面的问题 # -----------------------------------------------------------------------------------------------------# my_dict3 = dict() # my_dict3 = dict(name='a', old=33) my_dict3.update({"first": 'funny', "middle": 2, "last": 'dag'}) # -----------------------------------------------------------------------------------------------------# # 字典的索引 # -----------------------------------------------------------------------------------------------------# # 获取元素的值方法一 print('方法一获取元素的值:', my_dict3["first"]) # 获取元素的值方法二 my_value = my_dict3.get('first')  # 得到键对应的值 print('方法二获取元素的值:', my
py3study
2020/01/19
8850
Python字典dict
举个例子,假设要根据同学的名字查找对应的成绩,如果用列表(list)实现,需要两个list:
py3study
2020/01/14
6510
Python dict()函数
参数说明:key/value -- 用于创建字典的键/值对,可以表示键/值对的方法有很多。
用户7886150
2021/01/23
8010
Python 遍历 dict
字典提供了 items () 方法返回字典中所有的键值对 item 键值对 item 是一个元组(第 0 项是键、第 1 项是值)
chuchur
2022/10/25
5750
1分钟链圈 | V神为什么不接受谷歌的邀请?竟然是薪水给得太低了 !
这里是 8 月 20 日的每日1句话新闻晚报,只需1分钟,看看全球最热、最新的区块链新闻。
区块链大本营
2018/09/21
4630
1分钟链圈 | V神为什么不接受谷歌的邀请?竟然是薪水给得太低了 !
Python 字典 — dict
del goods_dict[key]、goods_dict.pop(key) 都是指定键key,删除字典内的键值对。
忆想不到的晖
2021/12/06
7060
Python 字典 — dict

相似问题

类型参数不在其范围之内:应该是'RecyclerView.ViewHolder!‘的子类型!

12

类型参数T不在其范围之内;应该扩展MyBaseClass

13

价值不在熊猫的范围之内。

11

Java泛型类型参数项目不在类型变量E的范围之内

11

泛型编译错误:类型参数不在类型变量S的范围之内

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文