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

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

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

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

Q&A

解決済

2回答

1636閲覧

minecraftでのifがUnreachable statementになってしまっている。

horizon

総合スコア21

Java

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

0グッド

0クリップ

投稿2019/05/13 18:11

前提・実現したいこと

自分のプレイヤー周りのエンティティを取得し、それにargs[0]で指定したポーション効果を付与するというコマンドを作成していました。そこで使われたifがUnreachable statementであるといわれエラー文が出ましたが解決法がわかりません。誰か解説のほどよろしくお願いいたします。

発生している問題・エラーメッセージ

potionコマンドでのif (containsPotionEffectType(args[0]))…の部分のif構文にてUnreachable statementエラー文が出ている。

該当のソースコード

package com.horizon.first; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; public final class First extends JavaPlugin implements Listener { @Override public void onEnable() { // Plugin startup logic System.out.println("\u001b[32m" + "Firstプラグインが有効になったよ!" + "\u001b[m");//コンソール上で緑に。参考URLは➤http://blog.livedoor.jp/killxia/archives/6461751.html Bukkit.getServer().getPluginManager().registerEvents(this,this); } @Override public void onDisable() { // Plugin shutdown logic System.out.println("\u001b[31m" + "Firstプラグインが無効になったよ!" + "\u001b[m");//コンソール上で赤に。(赤は"\u001b[31m"が担っている。) } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (command.getName().equalsIgnoreCase("heal")) {//command.getName(Object1)とその後ろにあるequalsIgnoreCase(Object2)の中にあるObject1とObject2を比較して合致を調べる。Trueで処理続行 if (!(sender instanceof Player)) {//senderの判断。コンソールは回復しないから区別する必要あり。 sender.sendMessage(ChatColor.GOLD + "このコマンドはプレイヤーからでしか使えないよ!");//エラー文送信 return true;//trueなら上記エラー文を送信せず、falseの場合plugin.ymlのusageがsenderに送信される。helpだhelp. } Player player = (Player) sender;//上記ifよりコンソールかプレイヤーか判別してるからplayer変数にsenderできる player.setHealth(20.0); player.sendMessage(ChatColor.AQUA + "体力全快!"); return true; } if (command.getName().equalsIgnoreCase("flying")) {//command.getName(Object1)とその後ろにあるequalsIgnoreCase(Object2)の中にあるObject1とObject2を比較して合致を調べる。Trueで処理続行 if (!(sender instanceof Player)) {//senderの判断。コンソールは回復しないから区別する必要あり。 sender.sendMessage(ChatColor.GOLD + "このコマンドはプレイヤーからでしか使えないよ!");//エラー文送信 return true;//trueなら上記エラー文を送信せず、falseの場合plugin.ymlのusageがsenderに送信される。helpだhelp. } Player player = (Player) sender; player.setAllowFlight(true); player.sendMessage(ChatColor.DARK_GREEN + "サバイバルモードで飛行できるよ!"); return true; } if (command.getName().equalsIgnoreCase("potion")) { if (!(sender instanceof Player)) { sender.sendMessage(ChatColor.GOLD + "このコマンドはプレイヤーからでしか使えないよ!"); return true; } Player player = (Player) sender; //このコマンドは,/porsion args[0] args[1]...と定義づけられる if (args[0] == null) ; { player.sendMessage(ChatColor.MAGIC + "エフェクト名を入力しよう!"); return true; } if (containsPotionEffectType(args[0])) { for (Entity entity : player.getNearbyEntities(100, 100, 100)) { if (entity instanceof LivingEntity) { ((LivingEntity) entity).addPotionEffect(new PotionEffect(PotionEffectType.getByName(args[0]), 100, 100)); } } return true; } else{ player.sendMessage(ChatColor.GOLD + "正しいエフェクト名を入力してね!"); return true; } } return true; } private boolean containsPotionEffectType(String string){ PotionEffectType effectType = PotionEffectType.getByName(string); if(effectType == null) return false; return true; } @EventHandler public void onJoin(PlayerJoinEvent e){//プレイヤがサーバーに入ったときに発生するイベント、event変数に格納される。 Player p = e.getPlayer();//入ってきたプレイヤー名をGet e.setJoinMessage(ChatColor.YELLOW + "おや… " + ChatColor.WHITE + p.getName() + ChatColor.YELLOW +" が降臨したようだ…"); } }

試したこと

そもそもUnreachable statementってなんぞやってなり、調べたらifが型として解決していない…ということなのでしょうか。ifはreturn true;で返してるはず…などとなり頭がパンクしました。

補足情報(FW/ツールのバージョンなど)

IDEA/Gradleで作っています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

"Unreachable statement"は「到達不能コード」、またの名を「デッドコード」と呼び、いかなる状況においても決して実行されることがないコードであることを意味します。ここでは、いかなる状況であっても

java

1 if (containsPotionEffectType(args[0]))

の部分にはたどり着けないということを意味します。

なぜそんなことが起こったか?原因はすぐ上にありました。

java

1 //このコマンドは,/porsion args[0] args[1]...と定義づけられる 2 if (args[0] == null) ; 3 { 4 player.sendMessage(ChatColor.MAGIC + "エフェクト名を入力しよう!"); 5 return true; 6 }

このif文が、ifの直後に空文;が入っています。このため、直後のブロックがifとは何の関連もない、スコープを限定するためだけのブロックになっています。つまり、エラーが出た行に到達する前に必ずreturn trueが実行されメソッドを抜けてしまうため、そのあとのコードは到達不可能となっているのです。

投稿2019/05/13 18:35

編集2019/05/14 03:11
swordone

総合スコア20651

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

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

horizon

2019/05/13 18:40

Unreachable statementに関する詳しい説明もありがとうございました!とてもわかり易かったです! 解決しました!
guest

0

java

1 2 if (args[0] == null) ; 3 { 4 player.sendMessage(ChatColor.MAGIC + "エフェクト名を入力しよう!"); 5 return true; 6 }

という箇所の、

if (args[0] == null)** ;**

ここのセミコロンが余計です。

セミコロンがあるせいで、if文では何も実行せずに、

次の{から}までが、必ず実行するようになっています。

そのため、次の
if (containsPotionEffectType(args[0])) {
は絶対に実行されることがありません(Unreachable statement)。

投稿2019/05/13 18:38

ngsvx

総合スコア287

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問