2

Java コード内に以下の 3 行を記述しました。

ArrayList<String> QuestionID = new ArrayList<String>();
;
ArrayList<String> QuestionType = new ArrayList<String>();

問題なく完璧にコンパイルおよび実行されます。

なぜそうするのですか?

2 行目に警告やエラーが表示されない理由がわかりません。

4

8 に答える 8

12

誰かが空のステートメントが有効であると判断しました。それだけです。空のステートメントを許可すると、たとえば、for本体が空のループの場合などに便利な場合があります。

例として、ツリーのルート ノードを見つける方法を次に示します (親リンケージがあり、ルート ノードには親がないと仮定します)。

for (Node parent = anyChildNode; parent.getParent() != null; parent = parent.getParent())
    ; // this for loop has no body, so an empty statement takes its place
于 2012-12-31T13:43:06.490 に答える
4

empty statement完全に有効な を書いているからです。

ここで、さらに説明を見つけます。

上記のリンクから -

このタイプのステートメントの有用性は限られています。私が考えることができる主な用途は、ループ構造に必要なステートメントを満たすことです。

これは私が最近使用した例です:

while ( sf(++n) != i) ;

このループは、sf(n​​) の戻り値が i に等しくなるまで、n の値を増やしながらメソッド sf を絶えず呼び出します。Java の各ループには、ループ本体で実行するコードが必要です。この場合、必要な作業はすべて条件で実行されるため、必須のループ本体は空のステートメントになります。

このビットのコードを記述する他の (より明確な) 方法があるかもしれませんが、これはその空のステートメントを使用できる場所の例です。

于 2012-12-31T13:43:10.673 に答える
4

許可されているだけでなく、 JLS に独自のセクションがあります。予想通り:

空のステートメントは何もしません。

さらに:

空のステートメントの実行は常に正常に完了します。

つまり、次のコード:

;

決して例外をスローしません。知っておくと良い ;-)

于 2012-12-31T13:51:30.337 に答える
1
#if DEBUG
    #define ASSERT(_x) Assert(x)
#else
    #define ASSERT(_x)
#endif

ASSERT(test);    // Results in null statement in non-debug builds

空のセミコロンは、その前に「空のステートメント」があることを意味します。それは完全に有効なケースです。

;「何も実行しない」を意味します。

空のステートメントの使用法に関する良い記事

于 2012-12-31T13:43:53.550 に答える
1

";" 命令なしのラインコードと見なされます。

構文エラーはありません。

于 2012-12-31T13:44:51.007 に答える
0

空のセミコロンはJAVAの有効なトークンであり、空のステートメントを示します。

于 2012-12-31T13:47:51.393 に答える
0

これは有効なステートメントであり、コンパイラーに何もしないように指示することに似ています。

于 2012-12-31T13:44:33.933 に答える
0

空のステートメントは C から Java にもたらされたもので、次のような場合に非常に便利です。

strcpy(char *s, char *t) {
    while(*s++ = *t++);
}
于 2012-12-31T13:44:59.837 に答える