たとえば、次のようなコードを書きます。
次のようにコードをコピーします。
int i;
{
int j=1;
i=j;
}
このコードがクラス定義領域に存在する場合、それがクラス属性の内容を初期化するために使用される通常のステートメント ブロックであることがわかり、クラスがインスタンス化されるときに呼び出され、その中でいくつかのメソッドを実行できます。
多くの場合、これは、複雑なクラスのコンテンツを初期化するために、シングルトン モードやその他のモードで使用されます。これにより、読み込みシーケンスによって発生する一部の実行時例外を回避できます。
しかし、このコードがメソッド内にある場合はどうなるでしょうか?
基本的にはまったく意味がありません。以前の考えでは、これは単にコードを囲むための形式であり、それ以外の何ものでもありませんでした。
今日は「ステートメントタグ」に関連する小さなコードを書きました。
次のようにコードをコピーします。
ラベル17: int i;
int j;
ThreadGroup[] スレッドグループの配列;
もし(フラグ)
ラベル 17 を破る;
0を返します。
「トークン ":" の構文エラー、{ このトークンの後に期待されます」という例外が ":" の位置で発生しました。
つまり、コードが 1 行に存在できない場合 (int i にはメソッド本体内に明確なインスタンス化/代入位置が必要です)、label17 をステートメント ブロックでマークする必要があります。
正しい形式は次のとおりです。
次のようにコードをコピーします。
ラベル17: {
int i;
int j;
ThreadGroup[] スレッドグループの配列;
もし(フラグ)
ラベル 17 を破る;
0を返します。
}
または:
ラベル17:
int i;
int j;
ThreadGroup[] スレッドグループの配列;
if (フラグ){
ラベル 17 を破る;
0 を返します;}
間違った使用法を見てみましょう。
次のようにコードをコピーします。
ラベル13: int x = 0;
明らかに、ラベルの後にはデフォルトの単一行ステートメント ブロックがあります。この x は今後どこでも使用できません。エラーです。ヒントは次のとおりです。
この行に複数のマーカーがあります
- x を変数に解決できません
- トークン「int」の構文エラー。このトークンを削除してください
正しい形式は 2 つあります。
次のようにコードをコピーします。
int x = 0;
ラベル13: x = 0;
または
ラベル13:{ int x = 0;}
そこで、以前の誤解は、for(){} や if(){} などの使用法では、論理 if() とステートメント ブロック {} は 2 つの独立した構文であるべきだということではないかと推測しました。