11

scan: {}ブロックで囲まれたコードのセクションを見つけたとき、私はいくつかのベースJavaオブジェクトを閲覧していました。次のコードは、Stringクラス内のtoLowerCase()メソッドからのものです。

scan: {
            for (firstUpper = 0 ; firstUpper < len; ) {
                char c = value[firstUpper];
                if ((c >= Character.MIN_HIGH_SURROGATE)
                        && (c <= Character.MAX_HIGH_SURROGATE)) {
                    int supplChar = codePointAt(firstUpper);
                    if (supplChar != Character.toLowerCase(supplChar)) {
                        break scan;
                    }
                    firstUpper += Character.charCount(supplChar);
                } else {
                    if (c != Character.toLowerCase(c)) {
                        break scan;
                    }
                    firstUpper++;
                }
            }
            return this;
        }

誰かがscan:{}ブロックが何のために使われ、この構文がどこから来たのか説明してもらえますか?三項演算子で使用されない限り、Javaでこのような単語の後にコロンが表示されることはありません。

ありがとう!

編集:回答された質問に正しく一致するようにタイトルを更新しました。

4

4 に答える 4

17

ここでscan:は、単にラベルです。このbreak <label>構文により、外部ループから抜け出し、gotoステートメントのいくつかの形式をシミュレートできます。構文はJLSに文書化されています:

breakラベル付きのステートメントは、そのラベルIdentifierと同じラベル付きステートメント(§14.7)に制御を移そうとします。Identifierブレークターゲットと呼ばれるこのステートメントは、すぐに正常に完了します。この場合、ブレークターゲットは、、、、、またはステートメントswitchwhileある必要はありません。dofor

于 2013-01-03T21:50:18.453 に答える
2

これはlabeled block.wherescan ラベルです。これは、複数のループがある場合に中断/続行するときに一般的に使用されます。この場合、実行時にラベル付けされたブロック(スキャン)からbreak scan;抜け出すだけです。

于 2013-01-03T21:50:00.893 に答える
2

ラベルを設定して、複数のループの深さから中断/または続行することができます。

 outer:
 for(int i=...){
   for(int j=..){
     ...
     break outer; // leaves both loops   

   } 

 }
于 2013-01-03T21:50:35.727 に答える
1

ですlabel。フロー制御の指標です。

コードを見ると、以下が表示されます

 break scan;

scanこれが発生すると、フローは完全にブロックを終了します。

ちなみに、これは任意の識別子にすることができscan、キーワードではありません。

于 2013-01-03T21:51:52.563 に答える