为何我的Minecraft物品配方插件出现Symbol does not appear in the shape:87错误?
排查Spigot插件配方报错:Symbol does not appear in the shape:87
这个错误我在写1.12版本Spigot插件时踩过同款坑,核心原因一眼就能锁定,咱们一步步拆解:
错误原因解析
从报错栈的核心提示就能看明白:
java.lang.IllegalArgumentException: Symbol does not appear in the shape:87
这句话的意思是:你尝试给一个叫87的符号绑定物品材料,但在你定义的**配方形状(shape)**里,根本没有出现过这个87符号。
举个错误代码的例子,一看就懂:
// 错误示范:形状里只有A、B,但给未出现的符号绑定了材料 ShapedRecipe testRecipe = new ShapedRecipe(new ItemStack(Material.DIAMOND_SWORD)); // 配方形状的3行字符串里,只有A和B两个符号 testRecipe.shape("ABA", "ABA", " B "); // 这里错误地给87相关的符号设置材料,但形状里根本没这个符号 testRecipe.setIngredient('8', Material.IRON_INGOT); testRecipe.setIngredient('A', Material.GOLD_INGOT); testRecipe.setIngredient('B', Material.STICK);
另外要注意:Spigot的ShapedRecipe符号只能是单个字符(char类型),如果你不小心误传了多字符的符号(比如把字符串当成char用),也会触发类似错误。
修复步骤
- 打开报错指向的
CustomRecpie.java第18行,找到对应的setIngredient()调用,确认你用的符号具体是什么(这里是87相关的字符) - 往上查找这个配方的
shape()方法定义,检查这个符号有没有出现在配方的形状字符串里 - 修正匹配问题:
- 如果是手滑打错了符号:把
setIngredient里的符号改成形状里已经存在的字符(比如把8改成A或B) - 如果确实需要用这个符号:把形状字符串里加入对应的单个字符(比如把形状里某位置改成
8)
- 如果是手滑打错了符号:把
给个正确的代码示例参考:
// 正确示范:符号和形状完全匹配 ShapedRecipe testRecipe = new ShapedRecipe(new ItemStack(Material.DIAMOND_SWORD)); // 形状里加入了8这个符号 testRecipe.shape("888", "ABA", "888"); // 现在给8绑定材料就不会报错了 testRecipe.setIngredient('8', Material.IRON_INGOT); testRecipe.setIngredient('A', Material.GOLD_INGOT); testRecipe.setIngredient('B', Material.STICK);
额外排查点
- 检查是否有拼写错误:比如形状里写的是
7,但setIngredient里用的是8 - 确认配方形状的每行字符串长度一致:如果形状行长度不一样,也可能间接导致符号匹配异常
内容的提问来源于stack exchange,提问作者Offlical




