Java Language
基本的なコントロール構造
サーチ…
備考
すべての制御構造は、特に明記しない限り、 ブロック文を使用します 。これらは中括弧{}示されます。
これは、中括弧を必要としない 通常のステートメントとは異なりますが 、前のステートメントの直後の行だけが考慮されるという厳しい警告もあります。
したがって、中括弧を使わないでこれらの制御構造を書くことは完全に有効です。先頭に続く文は1つだけですが、バグの多い実装や壊れたコードにつながる可能性があるため、 強くお勧めします。
例:
// valid, but discouraged
Scanner scan = new Scanner(System.in);
int val = scan.nextInt();
if(val % 2 == 0)
System.out.println("Val was even!");
// invalid; will not compile
// note the misleading indentation here
for(int i = 0; i < 10; i++)
System.out.println(i);
System.out.println("i is currently: " + i);
If / Else If / Elseコントロール
if (i < 2) {
System.out.println("i is less than 2");
} else if (i > 2) {
System.out.println("i is more than 2");
} else {
System.out.println("i is not less than 2, and not more than 2");
}
ifブロックは、 iが1以下のときにのみ実行されます。
else if条件は、その前のすべての条件(以前のelse ifコンストラクト、およびparent ifコンストラクト)がfalseテストされているifのみチェックされfalse 。この例では、 else if条件は、 iが2以上の場合にのみチェックされます。
その結果がtrueであれば、そのブロックが実行され、 else以降のelse ifおよびelseコンストラクトはスキップされます。
どれ場合ifとはelse ifの条件がにテストされたtrue 、 else最後のブロックは実行されません。
For Loops
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
3つの成分forループ(によって分離が; )変数の宣言/初期化され(ここでint i = 0 (ここで、条件) i < 100 )、および増分ステートメント(ここでi++ )。変数の宣言は、 {最初の実行時に{内部に置かれたかのように1回実行されます。そして、条件がチェックされていることがある場合は、 trueループの本体は、それがある場合は、実行されるfalseループが停止します。ループが続くと、ボディが実行され、最後に}に達すると、条件が再びチェックされる直前にインクリメントステートメントが実行されます。
ループに1つのステートメントだけが含まれている場合、中括弧はオプションです(セミコロンで1行にすることができます)。しかし、誤解やバグを避けるために中括弧を使用することが常に推奨されます。
forループコンポーネントはオプションです。ビジネスロジックにこれらのパーツが含まれている場合は、 forループから対応するコンポーネントを省略できます。
int i = obj.getLastestValue(); // i value is fetched from a method
for (; i < 100; i++) { // here initialization is not done
System.out.println(i);
}
for (;;) { function-body }構造体は、 while (true)ループと同じです。
Nested For Loops
ネストされたループと呼ばれる内部に別のループステートメントを持つループステートメント。より多くの内部ループを持つループの場合と同じ方法は、 'nested for loop'と呼ばれます。
for(;;){
//Outer Loop Statements
for(;;){
//Inner Loop Statements
}
//Outer Loop Statements
}
入れ子にされたforループは、三角形の数字を表示することが実証できます。
for(int i=9;i>0;i--){//Outer Loop
System.out.println();
for(int k=i;k>0;k--){//Inner Loop -1
System.out.print(" ");
}
for(int j=i;j<=9;j++){//Inner Loop -2
System.out.print(" "+j);
}
}
Whileループ
int i = 0;
while (i < 100) { // condition gets checked BEFORE the loop body executes
System.out.println(i);
i++;
}
カッコ内の条件がtrue限り、 whileループが実行されtrue 。これは、メインループ本体が毎回実行される前に条件文が満たされなければならないため、「テスト前ループ」構造とも呼ばれます。
ループに1つのステートメントしか含まれていない場合は、中括弧はオプションですが、いくつかのコーディングスタイルの規則では、中括弧を必要としません。
do ... whileループ
do...whileループは、少なくとも1回は実行することが保証されている点で、他のループとは異なります。条件文はメインループ本体の後に実行されるため、「テスト後のループ」構造とも呼ばれます。
int i = 0;
do {
i++;
System.out.println(i);
} while (i < 100); // Condition gets checked AFTER the content of the loop executes.
この例では、ループが実行された後にループ条件が評価されるため、 100が印刷されるまでループが実行されます(条件はi < 100でi <= 100ありません)。
少なくとも1つの実行を保証することで、ループ外の変数を宣言して内部で初期化することができます。
String theWord;
Scanner scan = new Scanner(System.in);
do {
theWord = scan.nextLine();
} while (!theWord.equals("Bird"));
System.out.println(theWord);
このコンテキストでは、 theWordはループの外側で定義されますが、自然なフローに基づいて値が保証されるため、 theWordは初期化されます。
For Each
Java 5以降では、for-eachループ(拡張forループとも呼ばれます)を使用できます。
List strings = new ArrayList();
strings.add("This");
strings.add("is");
strings.add("a for-each loop");
for (String string : strings) {
System.out.println(string);
} 各ループはIterableインタフェースの配列と実装を反復処理するために使用でき、後でListやSetなどのCollectionsクラスが含まれます。
ループ変数は、ソース・タイプから割り当て可能な任意のタイプにすることができます。
Iterable<T>またはT[]拡張forループのループ変数は、タイプS場合がありますIterable<T>
-
T extends S -
TとS両方がプリミティブ型であり、キャストなしで割り当て可能です -
Sはプリミティブ型であり、Tはunboxing変換後にSに代入可能な型に変換できます。 -
Tはプリミティブ型であり、自動ボクシング変換によってSに変換することができます。
例:
T elements = ...
for (S s : elements) {
}
| T | S | コンパイルする |
|---|---|---|
| int [] | 長いです | はい |
| 長いです[] | int | いいえ |
Iterable<Byte> | 長いです | はい |
Iterable<String> | CharSequence | はい |
Iterable<CharSequence> | 文字列 | いいえ |
| int [] | 長いです | いいえ |
| int [] | 整数 | はい |
If / Else
int i = 2;
if (i < 2) {
System.out.println("i is less than 2");
} else {
System.out.println("i is greater than 2");
}
if文は、条件の結果に応じて条件付きで括弧内のコードを実行します。括弧内の条件が真の場合、 {と}中括弧で定義されたif文のブロックに入ります。閉じ括弧がifステートメントのスコープになるまで、ブラケットを開きます。
elseブロックはオプションで省略することができます。 if文がfalseのif実行され、 if文がtrueのifは実行されません。この場合if文が実行されるためです。
Ternary Ifも参照してください。
スイッチ文
switch文は、Javaの多方向分岐文です。長いif - else if - elseチェーンの代わりに使用して、それらをより読みやすくします。ただし、 if文とは異なりif不等式は使用できません。各値を具体的に定義する必要があります。
switch文には3つの重要なコンポーネントがあります。
-
case:これはswitch文の引数と等価であるかどうか評価される値です。 -
default:これはオプションのキャッチオール式であり、case文のどれもがtrue評価されtruecase限りtrue。 -
caseステートメントの突然の完了。通常break:これは、さらに、望ましくない評価を防止するために必要とされるcaseステートメントを。
continue除いて、ステートメントの突然の完了を引き起こすステートメントを使用することは可能です。これも:
-
break -
return -
throw
以下の例では、典型的なswitchステートメントが、 defaultを含む4つの可能なケースで記述されていdefault 。
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
switch (i) {
case 0:
System.out.println("i is zero");
break;
case 1:
System.out.println("i is one");
break;
case 2:
System.out.println("i is two");
break;
default:
System.out.println("i is less than zero or greater than two");
}
breakや途方もない補完を行うステートメントを省略breakことで、いくつかの値に対して評価される「フォールスルー」ケースとして知られるものを活用することができます。これは、値が成功する範囲を作成するのに使用できますが、不等式ほど柔軟ではありません。
Scanner scan = new Scanner(System.in);
int foo = scan.nextInt();
switch(foo) {
case 1:
System.out.println("I'm equal or greater than one");
case 2:
case 3:
System.out.println("I'm one, two, or three");
break;
default:
System.out.println("I'm not either one, two, or three");
}
foo == 1場合、出力は次のようになります。
I'm equal or greater than one
I'm one, two, or three
foo == 3場合、出力は次のようになります。
I'm one, two, or three
switch文は、 enumで使用することもできます。
enum Option {
BLUE_PILL,
RED_PILL
}
public void takeOne(Option option) {
switch(option) {
case BLUE_PILL:
System.out.println("Story ends, wake up, believe whatever you want.");
break;
case RED_PILL:
System.out.println("I show you how deep the rabbit hole goes.");
break;
}
}
switch文は、 Stringで使用することもできます。
public void rhymingGame(String phrase) {
switch (phrase) {
case "apples and pears":
System.out.println("Stairs");
break;
case "lorry":
System.out.println("truck");
break;
default:
System.out.println("Don't know any more");
}
}
三項演算子
場合によっては、条件をチェックして変数の値を設定する必要があります。
例えば、
String name;
if (A > B) {
name = "Billy";
} else {
name = "Jimmy";
}
これは次のように簡単に1行で記述できます。
String name = A > B ? "Billy" : "Jimmy";
変数の値は、条件が真であれば、条件の直後の値に設定されます。条件がfalseの場合、2番目の値が変数に与えられます。
ブレーク
breakステートメントは、ループの終了( for 、 while )またはswitchステートメントの評価を終了します。
ループ:
while(true) {
if(someCondition == 5) {
break;
}
}
この例のループは永遠に実行されます。しかしsomeConditionがある実行点で5に等しいとき、ループは終了する。
複数のループがカスケード接続されている場合、最も内側のループのみがbreakを使用して終了します。
試してください...キャッチ...最後に
try { ... } catch ( ... ) { ... }制御構造は、 例外を処理するために使用されます 。
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
}
これは印刷されます:
無効入力。 'abc'は有効な整数ではありません。
catch後にfinally節を追加することができます。 finally句は、例外がスローされたかどうかにかかわらず、常に実行されます。
try { ... } catch ( ... ) { ... } finally { ... }
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
} finally {
System.out.println("This code will always be run, even if an exception is thrown");
}
これは印刷されます:
無効入力。 'abc'は有効な整数ではありません。
このコードは、例外がスローされた場合でも常に実行されます
ネストされたブレーク/継続
ラベルステートメントを使用することで、外側ループをbreak / continueすることができます:
outerloop:
for(...) {
innerloop:
for(...) {
if(condition1)
break outerloop;
if(condition2)
continue innerloop; // equivalent to: continue;
}
}
Javaのラベルには他の用途はありません。
Javaでのステートメントの継続
continueステートメントは、現在の反復で残りのステップをスキップし、次のループ反復で開始するために使用されます。コントロールは、 continueステートメントからステップ値(インクリメントまたはデクリメント)(存在する場合)に進みます。
String[] programmers = {"Adrian", "Paul", "John", "Harry"};
//john is not printed out
for (String name : programmers) {
if (name.equals("John"))
continue;
System.out.println(name);
}
continue文は、プログラムの制御を名前付きループのステップ値(存在する場合)にシフトさせることもできます。
Outer: // The name of the outermost loop is kept here as 'Outer'
for(int i = 0; i < 5; )
{
for(int j = 0; j < 5; j++)
{
continue Outer;
}
}