到達不能なコードステートメントは、Java 初心者の間でよくある問題です。多くの初心者開発者は、このエラーを「デッドコード」(もう 1 つの Java 関連現象)と混同しています。この 2 つは見た目では似ていますが、いくつかの違いがありますので、それについてはこの投稿で説明します。それ以外にも、コンパイラが到達不能なコード ステートメントを返す最も一般的な理由を確認し、コードを再起動して実行するための簡単な修正方法をいくつか見つけます。
到達不能コードとは何ですか?
定義上、到達不能なステートメントとは、すぐにデプロイできるコードを実行するときにコンパイラーによって実行されないステートメントです。到達不能なコード return ステートメントは通常、プログラム内の論理エラーの兆候です。このようなステートメントになる理由はいくつかありますが、いずれの場合も、到達不能なコードは冗長であり、プログラムが乱雑になるため、絶対に回避する必要があります。到達不能なコードとデッドコード
開発コミュニティでは、「到達不能」コードと「デッド」コードの概念は事実上同義です。ただし、ドキュメントを読むときに細かい点に注意している場合は、開発ガイドラインでこの 2 つが別々に記載されていることが多いことに気づくかもしれません。デッドコードと到達不能コードの間に違いはありますか? 基本的に、2 つのエラーの違いは、コンパイラーがエラーに反応する方法にあります。コンパイラに入力したコードが到達不能な場合、Java 通知でコンパイル ランタイム エラーが発生します。ステートメントが「デッド コード」の場合、実行時エラーは発生しません。開発者には次のシステム警告が表示されます。
class DeadCode {
void deadcode_Method(boolean b) {
System.out.println("Reachable statement");
if(true) {
return;
}
System.out.println("Unreachable statement"); // dead code
}
}
デッドコードの場合は直接的なコンパイラ エラーがないため、検出は困難です。ただし、System.out.printIn の戻り値を注意深く追跡していれば、デッド コードをキャッチしても問題は発生しません。
到達不能なコードステートメントが表示される理由
幸いなことに、到達不能なコードの問題の原因を追跡するのは簡単です。コンパイラがエラーを返し続ける主な理由は 3 つあります。- 転送ステートメント。return ステートメントでコードを中断すると、「return = true」以降は何も実行されません。
- 無限ループ - システムはループ アクションを繰り返し続けるため、無限ループの後に作成したコードは実行されません。したがって、コードをバイト コードに変換すると、コンパイラは到達不能コード エラーを送信します。
ステートメントを返す
return ステートメントは Transfer キーワード グループの一部であり、メソッドを終了することを意味します。これは関数を分離するのに役立ち、コードを読みやすくクリーンに保つのに役立ちます。ただし、return = true の後に関数に新しいステートメントを追加することはできないため、キーワードの後に関数を続行しようとすると、「コードに到達できません」というコンパイラ エラーが発生します。「return = true」の誤処理の例と、それに対するコンパイラの反応方法を見てみましょう。
class GFG {
public static void main(String args[])
{
System.out.println("My code will run");
return;
// ironically, this code will never run
// here’s an unreachable code message a developer gets.
System.out.println("My code will run");
}
}
return ステートメントの誤用がコンパイラでどのように表示されるかを次に示します。
prog.java:11: error: unreachable statement
System.out.println(“My code will run”);
^
1 error
学んだことをさらに強化するには、Java コースのビデオ レッスンを視聴することをお勧めします。
ブレークステートメント
Break ステートメントは、Java 関数を作成するときに注意する必要があるもう 1 つのタイプのキーワードです。定義により、break キーワードはループを終了するために使用されます。以下の例では、開発者がループを終了すると、8 行目のステートメントを実行できなくなります。そのため、コンパイラはステートメント到達不能エラーを表示します。到達不能なコード ステートメントが発生するサンプル コードを次に示します。
public class JavaCodeGeeks
{
public static void main(String[] args) {
for(int i=1;i<5;i++)
{
System.out.println(i);
break;
System.out.println("Code after break");
}
}
}
コンパイラの観点からエラーを見ると、次のエラー ステートメントが表示されます。
JavaCodeGeeks.java:8: error: unreachable statement
System.out.println("After break");
^
1 error
ステートメントを継続する
Continue は、アクションを繰り返すために使用されるループ制御キーワードです。ループの実行を単独で最初から開始したい場合は、コードに continue を追加します。このステートメントは、開発者がループ内のどのステートメントを繰り返したいのか、どのステートメントを繰り返しに含めないのかを選択するのに役立ちます。continue は簡単に使用できるキーワードですが、その仕組みを完全に理解していないと、開発者は「コードに到達できない」という罠に陥ります。continue に遭遇すると、システムはループを繰り返すため、キーワードはそれに続くステートメントに到達できなくなります。次のコードがあるとします。
public class JavaIsFun
{
public static void main(String[] args) {
for(int i=0;i<8;i++)
{
System.out.println(i);
if(i==5)
{
continue;
System.out.println("Coding after continue");
}
}
}
}
システムは「Coding after continue」ステートメントを実行しません。コンパイラーはそれをすぐに通知します。
JavaIsFun.java:10: error: unreachable statement
System.out.println("Coding after continue");
無限ループ
「break」および「Continue」キーワードの使用例に似たシナリオは、無限ループのシナリオです。無限ループを設計するとき、開発者は、それ以降のステートメントは実行されないことを覚えておく必要があります。したがって、ループを中断しないと、その後に記述されたすべてのコードに到達できなくなります。以下に、無限ループの誤処理の興味深い例を示しますので、確認してください。
public class JavaCodeGym
{
public static void main(String[] args) {
while(true)
{
System.out.println("Hey there");
}
System.out.println("Nice to see you");
}
}
どこにエラーが隠れているか推測できますか? コードを実行すると、コンパイラはすぐにそれをポイントします。
//unreachable code statement compiler error
JavaCodeGym.java:10: error: unreachable statement
System.out.println("Nice to see you");
‘
"Nice to see you" の前に無限ループがあるため、ステートメントは実行されず、到達不能なコード エラーが返され続けます。
GO TO FULL VERSION