Java Concept Of The Day

Unreachable Code :

Every statement in any java program must be reachable i.e. every statement must be executable at least once in any one of possible flows.The Javaプログラムは、到達不能なコードを生成することができます。 もし、あるコードが可能なフローのどれにおいても実行可能でない場合、それは到達不能コードと呼ばれます。

次の例を見てください。

public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){if(b){return;}else{return;}System.out.println("Unreachable Statement"); //Compile Time Error : Unreachable Code}}

この例では、14行目でコンパイルタイムエラーが発生します。 Unreachable Code. なぜなら、この文はどのフローでも到達できないからです。 もしbが真であれば、ifブロックが実行され、制御が返されます。 もし、boolean “b “がfalseなら、elseブロックが実行され、制御が戻されます。 つまり、どちらのフローでも、14行目には制御が来ない。 到達できないままです。

Have a look at this example.

public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");return;System.out.println("Unreachable Statement"); //Compile Time Error}}

In this example, UnreachableCode_method() has only one flow. このフローでは、すべてのステートメントが少なくとも一度は実行されなければなりません。 しかし、2つ目のステートメントで制御が戻ってきます。

Dead Code :

デッドコードも到達不能コードですが、デッドコードはコンパイル時のエラーにはなりません。
例えば、

public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");if(true){return;}System.out.println("Unreachable Statement"); //Dead Code}}

上記の例では、if ブロックに定数値 “true” を渡しているため、常に実行されることになります。 そのため、12行目が到達不能になります。 しかし、コンパイラはそれについて文句を言いません。

では、上記の例を少し修正し、ifブロックをwhileブロックに置き換えて、コンパイルして何が起こるか見てみましょう。 Unreachable code “と表示されます。 しかし、なぜでしょうか。 なぜコンパイラは while ブロックを見て気が変わったのでしょうか。

これは、コンストラクタ、メソッド、try、catch、if、for、while などの異なるブロックに対する到達不能コードのルールは、Java 言語仕様で個別に定義されているためです。 Java言語仕様では、Ifブロックの条件式はコンパイル時に評価されず、到達不能コードが決定されます。 そのため、ifブロックの場合、コンパイル時にエラーが発生することはありません。 到達不能コードのルールはこちらで確認できます。

コメントを残す

メールアドレスが公開されることはありません。