質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Q&A

解決済

1回答

2492閲覧

Minecraft Plugin

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

0グッド

0クリップ

投稿2020/06/01 17:27

マインクラフトのプラグインを作って試してみると、謎のエラーが出ました。
いろいろ他の方法で試してみたんですけど、毎回エラーが出たりエラーが出なかったときは書いたことがが動作しなかったりします。

Sorce

1 public void InventoryDrop(Player p) { 2 ItemStack[] is = new ItemStack[36]; // インベントリースロット指定 3 for(int i = 0; i < is.length; i++) { 4 is[i] = new ItemStack(p.getInventory().getItem(i)); // インベントリーのアイテムをゲット 5 p.getWorld().dropItem(p.getLocation().add(0,1,0),is[i]); // ゲットしたアイテムを落とす。 6 p.getInventory().setItem(i, new ItemStack(Material.AIR)); // 落としたアイテムをインベントリーから消去する。 7 } 8 }

このコードはインベントリーのアイテムをすべて落とすというコードです。
これを実行すると、

Error

1[02:15:23 ERROR]: null 2org.bukkit.command.CommandException: Unhandled exception executing command 'testdrop' in plugin Repick_Test v1.0 3 at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[Spigot.jar:git-Spigot-db6de12-18fbb24] 4 at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[Spigot.jar:git-Spigot-db6de12-18fbb24] 5 at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) ~[Spigot.jar:git-Spigot-db6de12-18fbb24] 6 at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [Spigot.jar:git-Spigot-db6de12-18fbb24] 7 at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [Spigot.jar:git-Spigot-db6de12-18fbb24] 8 at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [Spigot.jar:git-Spigot-db6de12-18fbb24] 9 at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [Spigot.jar:git-Spigot-db6de12-18fbb24] 10 at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [Spigot.jar:git-Spigot-db6de12-18fbb24] 11 at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?] 12 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?] 13 at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [Spigot.jar:git-Spigot-db6de12-18fbb24] 14 at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [Spigot.jar:git-Spigot-db6de12-18fbb24] 15 at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [Spigot.jar:git-Spigot-db6de12-18fbb24] 16 at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [Spigot.jar:git-Spigot-db6de12-18fbb24] 17 at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [Spigot.jar:git-Spigot-db6de12-18fbb24] 18 at java.base/java.lang.Thread.run(Thread.java:832) [?:?] 19Caused by: java.lang.IllegalArgumentException: Cannot copy null stack 20 at org.apache.commons.lang.Validate.notNull(Validate.java:192) ~[Spigot.jar:git-Spigot-db6de12-18fbb24] 21 at org.bukkit.inventory.ItemStack.<init>(ItemStack.java:135) ~[Spigot.jar:git-Spigot-db6de12-18fbb24] 22 at com.gmail.leakerpvp.repicktest.RepickTest.InventoryDrop(RepickTest.java:34) ~[?:?] 23 at com.gmail.leakerpvp.repicktest.RepickTest.onCommand(RepickTest.java:24) ~[?:?] 24 at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[Spigot.jar:git-Spigot-db6de12-18fbb24] 25 ... 15 more

というエラーが出ます。
インベントリーをすべて埋めたらエラーは出ないんですけど一マスでも空いていたら、エラーが出ます。
エラー内容か対処法があったら教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/06/02 00:10

is[i] = new ItemStack(p.getInventory().getItem(i)); の行がRepickTest.javaの34行目で合ってますか?
guest

回答1

0

ベストアンサー

まずここを読んでみましょう。
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/Inventory.html#getItem-int-
@Nullable getItem(int index)となっていますが、
@Nullableというのはこの関数がnullを返す可能性があることを示しています。
具体的には、そのスロットにアイテムがなかった場合にnullを返すのでしょう。

次にnew ItemStackの方を見てみましょう。
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/ItemStack.html
こちらには、
ItemStack(@NotNull ItemStack stack)となっています。
@NotNullは、逆にnullは受け付けない事を示しています。

つまり、@Nullable getItem(int index)で返されたnullを、
nullを受け付けられないnew ItemStack(@NotNull ItemStack stack)にそのまま渡しているのが原因です。

渡してしまう前に == nullなどでnullが返っていないか確認する必要があります。

ちなみに、
Caused by: java.lang.IllegalArgumentException
とエラーが出ていますが、IllegalArgumentExceptionは引数がおかしい場合に返される例外です。
その後に続く
Cannot copy null stack
というのは、そのまんまの意味で「nullをコピーできません」という事になります。
エラー内容と行数を見れば原因は大きく絞られるので、質問する前にもう少し調べてみましょう。

投稿2020/06/02 10:37

編集2020/06/02 10:39
ozraru

総合スコア150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/02 13:02

とても分かりやすく回答してくれたおかげで、解決出来ました!ありがとうございます! 今度からはもうちょっと調べてから質問します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問