FAQ

介绍

这个专栏是用来解答一些常规问题的专栏。

由于遇到的问题实在是多,并且问题重复性也高,所以我决定编写这个专栏,以便大家能够更快地找到类似问题的解决方法。

专栏将定期更新,我会收集一些常见问题,然后进行解答。

如果你有任何问题,可以前往QQ群提问,也可以前往QQ频道留言(因为可以发帖子,相似的问题也能够查看,不需要重复提问)。之前也一直在找和Discord类似的平台,也只有频道能发帖了。

ps:不要直接来找我,我的专业很忙,没时间回答你的问题

频道链接:北山の频道

学会提问

在提问之前,你需要学会如何提问。

如何提问

另外这里也有一篇文章,可以帮助你学会如何提问:提问的智慧

学会看日志

注意,为了避免产生歧义,此处所说的日志均为运行游戏时,在运行窗口输出的日志,并不是崩溃报告

以前,你玩游戏,游戏崩了,不会看日志也就算了。把日志发给别人看看,让别人帮你解决,那问题不大。

但是现在,你在开发模组,如果你还是不会看日志,甚至连Java的报错信息都不会看,那我建议你先学会看日志再学习模组开发。

我能说99%的问题你看日志就能解决,剩下的1%基本上是IDEA抽风了、gradle抽风了、jdk坏了等等非常规的问题。
当然还有写了bug,这个只能靠你自己测试出来,日志基本上不会报。
所以绝大多数问题都是可以通过日志解决的。日志能够详细地告诉你问题出在哪里,你只需要根据日志的提示来解决问题就好了。

虽然说我这里的教程并不会是最全面的,但是我会尽量让你们学会看日志,那么以下就是一些常见的日志信息:

INFO

1
[16:54:14] [main/INFO] (FabricLoader/GameProvider) Loading Minecraft 1.20.1 with Fabric Loader 0.16.3

INFO类型的是一个非常常见的日志,它会告诉你一些信息

[16:54:14]是时间戳

[main/INFO]是日志的级别和线程信息,main代表主线程,INFO代表这是一个信息级别的日志(即非错误、警告,仅用于提供信息)

(FabricLoader/GameProvider)是生成日志的模块或者组件

Loading Minecraft 1.20.1 with Fabric Loader 0.16.3是日志的内容,表示Minecraft 正在使用 Fabric Loader 0.16.3 来加载 Minecraft 1.20.1 版本

我们自己的模组也会有,如果你留着主类中的日志输出的话

1
[16:54:22] [Render thread/INFO] (arknights-furniture) Hello Fabric world!

WARN

1
[16:54:25] [Worker-Main-7/WARN] (Minecraft) Unable to load model: 'arknights-furniture:laterano_logo#inventory' referenced from: arknights-furniture:laterano_logo#inventory: java.io.FileNotFoundException: arknights-furniture:models/item/laterano_logo.json

WARN类型的日志是一个警告,表示有一些问题,但是不会影响游戏的正常运行

前面的几项内容和INFO类型的日志一样,不再赘述

而我们需要注意的是它的内容,这里是一个警告,表示无法加载模型arknights-furniture:laterano_logo#inventory(#inventory指物品在物品栏中的模型文件),
因为找不到arknights-furniture:models/item/laterano_logo.json文件

游戏能够正常运行,但是这个物品的模型无法加载,你将得到一个紫黑块

不过,在你前去检查你的文件之前,也先检查这个信息中的内容是否有问题

检查日志中的命名空间物品名字是否正确,如果没问题再去检查文件及其路径是否有问题

ERROR

1
[17:56:44] [Render thread/ERROR] (Minecraft) No data fixer registered for polishing_machine_block_entity

ERROR类型的日志是一个错误,表示有一些问题,可能会影响游戏的正常运行

前面的内容差不多,不过目前我自己的教程中的ERROR也就只有方块实体会报这玩意,然后实际情况是似乎能跑,就没管他

这里的内容表示没有为polishing_machine_block_entity注册数据修复器,要修的话照原版写一下就好了

DEBUG

这一类信息一般不会在游戏中看到,但你在调试的时候会看到,我这里就不举例子了

直接崩

虽然但是,有些时候是直接崩溃的,而在崩溃之前并没有什么信息

不过此时它会连带这把崩溃报告一起给你,你可以查看这个报告,看看是什么问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
---- Minecraft Crash Report ----
// My bad.

Time: 2024-09-04 18:13:21
Description: Initializing game

java.lang.RuntimeException: Could not execute entrypoint stage 'main' due to errors, provided by 'arknights-furniture' at 'com.besson.arknights.ArknightsFurniture'!
at net.fabricmc.loader.impl.FabricLoaderImpl.lambda$invokeEntrypoints$2(FabricLoaderImpl.java:403)
at net.fabricmc.loader.impl.util.ExceptionUtil.gatherExceptions(ExceptionUtil.java:33)
at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:401)
at net.fabricmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:52)
at net.minecraft.client.MinecraftClient.<init>(MinecraftClient.java:510)
at net.minecraft.client.main.Main.main(Main.java:188)
at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:480)
at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74)
at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:28)
at net.fabricmc.devlaunchinjector.Main.main(Main.java:86)
Caused by: java.lang.ExceptionInInitializerError
at com.besson.arknights.ArknightsFurniture.onInitialize(ArknightsFurniture.java:24)
at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:399)
... 7 more
Caused by: net.minecraft.util.InvalidIdentifierException: Non [a-z0-9_.-] character in namespace of location: Arknights-furniture:abyssal_hunters_logo
at net.minecraft.util.Identifier.validateNamespace(Identifier.java:337)
at net.minecraft.util.Identifier.<init>(Identifier.java:122)
at com.besson.arknights.item.ModItems.registerItem(ModItems.java:57)
at com.besson.arknights.item.ModItems.<clinit>(ModItems.java:11)
... 9 more

此处的报告我只截取了一部分,但这是一个显然易见的问题,也是一个老生常谈的问题

在实际开发过程中,属于你项目的类是可以直接在这个输出窗口中点击跳转的,直接跳转到出问题的地方,比如这里的ArknightsFurniture.java:24你可以直接点击跳转,那里的代码是

1
ModItems.registerItems();

ModItems.java:57

1
return Registry.register(Registries.ITEM, new Identifier(ArknightsFurniture.MOD_ID, id),item);

ModItems.java:11

1
public static final Item ABYSSAL_HUNTERS_LOGO = registerItem("abyssal_hunters_logo", new Item(new Item.Settings()));

当然,其实后面两个不去跳转也没关系,因为我们看这个报错信息就知道问题出在哪里了

1
Caused by: net.minecraft.util.InvalidIdentifierException: Non [a-z0-9_.-] character in namespace of location: Arknights-furniture:abyssal_hunters_logo

知道什么意思了吗?Arknights这个命名空间非法,所以报错了,而这个命名空间的规范性之前也在讲第一个物品中详细讲过了

总结

所以说,看日志解决问题是一个非常重要的技能,我强烈建议每一位开发者都能够学会这个技能

以后,说不定你就不需要向他人提问了,甚至你能够教别人如何解决问题,何乐而不为呢?

常见问题FAQ

现在开始正题(持续更新中)

Gradle下载卡住、下载慢、超时、下载失败等等

使用代理(IDEA需单独配置,或者你直接开TUN);或者使用国内镜像源(清华、阿里、腾讯等),具体方法请自行搜索

啥都不干的话,构建七八个小时也是有可能的

不支持发行版本21

这个是你Gradle使用的JDK版本与你项目结构和Gradle JVM版本不一致导致的

确保你的Gradle JVM版本和项目结构的JDK版本一致

build.gradle中可以看到当前Gradle使用的JDK版本

1
2
3
4
5
6
7
8
9
10
11
12
13
tasks.withType(JavaCompile).configureEach {
it.options.release = 21
}

java {
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()

sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

那么21使用的就是JDK21,17使用的就是JDK17

类明明在,但IDEA报错找不到

  • IDEA日常抽风,我教程中也遇到过(当然你先看看导的路径对不对)

  • 解决方法也很简单,在文件中,找到使缓存失效,移除项目的所有缓存和索引,重启IDEA,然后重新建构项目

方块、物品、实体等等显示为黑紫块

  • 看日志,看日志,看日志

  • 这种情况下基本上是你的资源文件(包括模型文件、材质文件等等)有问题,或者是你的命名空间有问题

Non [a-z0-9_.-] character in namespace of location

  • 一样的,非法字符,检查你的命名空间

xxx在xxx中具有private访问权限

  • 这个问题是因为你的类或者方法是私有的,而你在其他类中调用了这个类或者方法

  • 如果你调用的是原版的类或者方法,检查是否配置了正确的源文件(就是genSource得到的那些)

  • 如果不是源文件的问题,你可能需要考虑Mixin了

在ModItemTagProvider中super函数选择第一个三变量函数后面DataGenerator中我会报错,选择双变量的super函数不会报错

  • 三个变量的最后一个是给blockTag的

Gradle无法正常运行

  • 目前已知的除了网络问题无法下载之外,还有可能是你Gradle的缓存目录路径有中文
  • Gradle的默认缓存目录是C:\Users\用户名\.gradle,如果你的用户名中有中文,那么Gradle可能会无法正常运行
  • 用户名为中文的话,可以尝试更改Gradle的缓存目录
  • 要改用户名的话我的建议是重装系统,这也是我自己专业中遇到的问题(毕竟建模的,渲染的软件大多是国外的,对中文并没有完全支持),当然也有其他方法改,重装系统虽然麻烦但风险小一点