Spigot Minecraft插件开发Java ArrayList无法add添加元素问题
出错原因
这是Java基础语法错误:你把censored.add("example1")这条执行语句直接写在了Words类的类体中,不符合Java语法规范。
Java类的成员位置(类的大括号范围内,方法/代码块之外)只允许写以下内容:
- 成员变量声明与初始化赋值
- 成员方法、构造方法定义
- 静态代码块、实例代码块定义
- 内部类、接口声明
直接裸露的方法调用语句不属于合法的类成员内容,编译阶段就会直接报错,根本不会执行添加元素的逻辑。你最开始写的两行测试代码如果放在main方法或者其他普通方法里是可以正常运行的,挪到类体成员位置就会触发这个错误。
解决方案
根据Spigot插件的开发场景,提供三种可直接使用的正确写法,按需选择即可:
写法1:构造方法内初始化
实例化Words对象时会自动执行构造方法内的逻辑,完成敏感词加载:
package me.chiz.cava.AutoMute; import java.util.ArrayList; public class Words { ArrayList<String> censored = new ArrayList<String>(); // 类构造方法 public Words() { censored.add("example1"); // 后续新增敏感词直接在这后面追加add语句即可 } }
写法2:实例初始化块加载
如果不需要额外写构造方法,可以用实例初始化块包裹执行逻辑,效果和写在构造方法里一致:
package me.chiz.cava.AutoMute; import java.util.ArrayList; public class Words { ArrayList<String> censored = new ArrayList<String>(); // 实例初始化块 { censored.add("example1"); } }
写法3:静态全局集合(最适合插件敏感词场景)
如果敏感词表全局只需要维护一份,不需要每个Words实例单独存储,可以把集合定义为静态常量,用静态代码块初始化,后续不需要反复实例化对象,直接调用即可:
package me.chiz.cava.AutoMute; import java.util.ArrayList; import java.util.List; public class Words { public static final List<String> CENSORED = new ArrayList<>(); static { CENSORED.add("example1"); // 所有敏感词统一在静态块中加载 } }
使用时直接通过Words.CENSORED就能拿到完整的敏感词集合,性能更好也更方便调用。
开发提示:如果敏感词数量较多,不要硬编码在类文件中,建议把敏感词列表写到插件的
config.yml配置文件里,插件启动时读取配置加载到集合,后续调整敏感词不需要重新编译打包插件。
内容的提问来源于stack exchange,提问作者Chiz
相关产品推荐
相关产品推荐

