Fabric 1.20.6模组开发遇迭代错误:仅可遍历数组或Iterable实例
问题分析与解决
你遇到的运行时错误核心原因是:当前使用的Minecraft/Fabric版本中,ResourceManager.findResources()方法的返回值并非Iterable类型(比如部分新版本中该方法返回Stream<Identifier>而非旧版的Collection<Identifier>),导致增强for循环无法直接遍历。
解决方案
根据返回类型的不同,提供两种直接可用的修复方式:
方式1:改用Stream的forEach遍历
如果findResources()返回的是Stream<Identifier>,直接通过forEach处理每个资源ID:
@Override public void reload(ResourceManager manager) { manager.findResources("my_resource_folder", path -> path.endsWith(".json")) .forEach(id -> { try(InputStream stream = manager.getResource(id).getInputStream()) { // 在这里添加你的资源处理逻辑,比如读取解析JSON内容 } catch(Exception e) { LOGGER.error("Error occurred while loading resource json " + id.toString(), e); } }); }
方式2:转换为Iterable或List后使用增强for循环
如果习惯用增强for循环,可以将返回值转换为Iterable接口实例,或者收集到List中:
// 转换为Iterable的写法 @Override public void reload(ResourceManager manager) { Iterable<Identifier> resourceIds = () -> manager.findResources("my_resource_folder", path -> path.endsWith(".json")).iterator(); for(Identifier id : resourceIds) { try(InputStream stream = manager.getResource(id).getInputStream()) { // 资源处理逻辑 } catch(Exception e) { LOGGER.error("Error occurred while loading resource json " + id.toString(), e); } } }
或者收集到List(需导入java.util.stream.Collectors和java.util.List):
import java.util.stream.Collectors; import java.util.List; @Override public void reload(ResourceManager manager) { List<Identifier> resourceIds = manager.findResources("my_resource_folder", path -> path.endsWith(".json")) .collect(Collectors.toList()); for(Identifier id : resourceIds) { try(InputStream stream = manager.getResource(id).getInputStream()) { // 资源处理逻辑 } catch(Exception e) { LOGGER.error("Error occurred while loading resource json " + id.toString(), e); } } }
额外提示
- 确保你的Minecraft与Fabric API版本和参考文档匹配,不同版本的
ResourceManager方法签名可能存在差异; - 如果加载的是客户端资源(如模型、纹理),需将
ResourceType.SERVER_DATA替换为ResourceType.CLIENT_RESOURCES; - 资源监听器的ID(
getFabricId()返回的Identifier)建议使用自己模组的命名空间,比如new Identifier(MOD_ID, "my_resources"),避免与其他模组冲突。
内容的提问来源于stack exchange,提问作者Mr. Potatoes
相关产品推荐
相关产品推荐

