Java コード内に以下の 3 行を記述しました。
ArrayList<String> QuestionID = new ArrayList<String>();
;
ArrayList<String> QuestionType = new ArrayList<String>();
問題なく完璧にコンパイルおよび実行されます。
なぜそうするのですか?
2 行目に警告やエラーが表示されない理由がわかりません。
誰かが空のステートメントが有効であると判断しました。それだけです。空のステートメントを許可すると、たとえば、for
本体が空のループの場合などに便利な場合があります。
例として、ツリーのルート ノードを見つける方法を次に示します (親リンケージがあり、ルート ノードには親がないと仮定します)。
for (Node parent = anyChildNode; parent.getParent() != null; parent = parent.getParent())
; // this for loop has no body, so an empty statement takes its place
empty statement
完全に有効な を書いているからです。
ここで、さらに説明を見つけます。
上記のリンクから -
このタイプのステートメントの有用性は限られています。私が考えることができる主な用途は、ループ構造に必要なステートメントを満たすことです。
これは私が最近使用した例です:
while ( sf(++n) != i) ;
このループは、sf(n) の戻り値が i に等しくなるまで、n の値を増やしながらメソッド sf を絶えず呼び出します。Java の各ループには、ループ本体で実行するコードが必要です。この場合、必要な作業はすべて条件で実行されるため、必須のループ本体は空のステートメントになります。
このビットのコードを記述する他の (より明確な) 方法があるかもしれませんが、これはその空のステートメントを使用できる場所の例です。
許可されているだけでなく、 JLS に独自のセクションがあります。予想通り:
空のステートメントは何もしません。
さらに:
空のステートメントの実行は常に正常に完了します。
つまり、次のコード:
;
決して例外をスローしません。知っておくと良い ;-)
#if DEBUG
#define ASSERT(_x) Assert(x)
#else
#define ASSERT(_x)
#endif
ASSERT(test); // Results in null statement in non-debug builds
空のセミコロンは、その前に「空のステートメント」があることを意味します。それは完全に有効なケースです。
;
「何も実行しない」を意味します。
空のステートメントの使用法に関する良い記事
";" 命令なしのラインコードと見なされます。
構文エラーはありません。
空のセミコロンはJAVAの有効なトークンであり、空のステートメントを示します。
これは有効なステートメントであり、コンパイラーに何もしないように指示することに似ています。
空のステートメントは C から Java にもたらされたもので、次のような場合に非常に便利です。
strcpy(char *s, char *t) {
while(*s++ = *t++);
}