minecraft fabric mod1.21.10でプレイヤーからのキーボード入力を取得しようとしてimport net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;import net.minecraft.client.option.KeyBinding;import net.minecraft.client.util.InputUtil;import org.lwjgl.glfw.GLFW;こういったものをimportして入力のコードを書いたのですが、これらすべてExternal Libraryに存在しないといわれました。これが実際のエラーコードですエラー: パッケージnet.fabricmc.fabric.api.client.event.lifecycle.v1は存在しませんimport net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;エラー: パッケージnet.fabricmc.fabric.api.client.keybinding.v1は存在しませんimport net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;エラー: パッケージnet.minecraft.client.optionは存在しませんimport net.minecraft.client.option.KeyBinding;エラー: パッケージnet.minecraft.client.utilは存在しませんimport net.minecraft.client.util.InputUtil;いったいこれはなぜそのパッケージがないのでしょうか?そして追加する方法はあるのでしょうか?

1件の回答

回答を書く

1250206

2026-03-01 17:10

+ フォロー

追記


今回の「ExceptionInInitializerError / Item id not set」は、client と main の分割ではなく、「アイテムの登録まわりを static 初期化の中で触っている」ことが原因の可能性が一番高いです。

理由を順に書きます。

1
ExceptionInInitializerError は「あるクラスの static フィールドや static ブロックの初期化中に例外が出た」時のエラーです。
その中の Caused by: NullPointerException: Item id not set は「まだレジストリに登録されていない Item を使おうとして null になった」ときによく出ます。

2
よくあるパターンは次のようなものです。
・ModItems などのクラスで、static フィールドの初期化や static ブロックの中で
ItemStack を作る、アイテムグループに追加するなどの処理をしている
・その時点では Registry.register(…) がまだ呼ばれておらず、アイテムに id が付いていない
・結果として NPE → ExceptionInInitializerError になる

3
対策としては次の形に整理すると安定します。

・src/main/Java の「共有」クラスには
public static final Item HOOKSHOT_ITEM = new Item(new Item.Settings());
のように、単に new Item するだけにしておく
(ここでは ItemStack を作ったり、クリエイティブタブに入れたりしない)

・アイテムの登録は、ModInitializer の onInitialize から呼ばれるメソッドの中で行う
Registry.register(Registries.ITEM, new Identifier(“modid”, “hookshot”), HOOKSHOT_ITEM);
のように、必ず一度だけ登録する

・クリエイティブタブに入れる、ItemStack を作るなど「id が必要な処理」は
登録が終わったあとに実行するクラスやハンドラに分ける

4
IntelliJ の Minecraft プラグインで作り直した環境でも、結局 Fabric ローダで起動している限り、この「登録のタイミング」のルールは同じです。
元の Fabric テンプレートでも、今のプロジェクトでも、
「アイテムの登録は onInitialize 内のメソッドで、static 初期化の中ではレジストリを触らない」
この形になっているかを一度見直してみてください。

もし自分で作った ModItems や ModBlocks のようなクラスがあれば、その static 部分を重点的にチェックすると原因が見つかりやすいと思います。


追記


結論から言うと、Identifier.of(MOD_ID, path) の使い方で合っていますし、それが原因で「Item id not set」が出ているわけではありません。

1
最新版の Yarn 付き Minecraft では、Identifier のコンストラクタが private になっていて、代わりに Identifier.of を使うのが正しい使い方になっています。
Fabric の公式テンプレートも、まさに質問者様と同じように

private Identifier identifier(String path) {
return Identifier.of(MOD_ID, path);
}

という形で書いているので、この部分は問題ありません。

2
「Item id not set」は、アイテムがレジストリに登録される前に、そのアイテムから ItemStack を作ったり、id を参照したりしたときに出る例外です。
今回の Registry.register 自体は正しく書けているので、別の場所で HOOK_SHOT を早すぎるタイミングで触っている可能性が高いです。

よくある原因は次のようなものです。

・ModItems クラスなどで
public static final ItemStack HOOK_SHOT_STACK = new ItemStack(HOOK_SHOT);
のような static フィールドを定義している

・クリエイティブタブなどで、static 初期化中に new ItemStack(HOOK_SHOT) している

こういうコードはクラス読み込み時にすぐ実行されてしまうので、onInitialize の Registry.register より先に動き、まだ id の付いていない HOOK_SHOT を触ってしまいます。

対策としては

・static フィールドや static ブロックの中では HOOK_SHOT から ItemStack を作らない
・HOOK_SHOT を使う処理は、必ず onInitialize の中か、その後に呼ばれるメソッドの中に移す
・どうしても共有したい場合は、ItemStack ではなく Item の参照だけを static に持つ

という形に整理すると安全です。

一度、プロジェクト全体で「HOOK_SHOT」を検索してみて、static フィールドや static ブロックの中で ItemStack を作っていないかを確認してみてください。
Identifier.of の部分はそのままで大丈夫です。

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有