「年齢が 15 未満ならエラーにする」「性別が 1 なら男と表示する」のように、条件によって処理を変えることを 条件分岐 といいます。この章では、条件を表す式と、if 文・switch 文の書き方を学びます。文字列を比べる方法と、「何も入っていない」ことを表す null もここで学びます。
この章で学ぶこと
- 比較演算子と論理演算子で条件を書く
-
if・else if・else -
switch文 - 文字列の比較(
equals)と、==との違い -
nullの意味
5.1 この章で作るもの
この章では、ch05 パッケージに練習用のクラス Condition を作ります。章の最後には、実行するとコンソールに次のように表示されるようになります。
年齢:27
性別:女
名前は一致しています
名前の文字数:5
住所は入力されていません
| ファイル | 作業 | 内容 |
|---|---|---|
ch05/Condition.java |
新規 | 条件分岐を確かめる練習用のクラス |
5.2 Condition.java を作る
-
srcを右クリックし、新規 → パッケージ でch05パッケージを作ります。 -
ch05パッケージを右クリックし、新規 → クラス で、名前Condition、「public static void main(String[] args)」に チェックを入れて クラスを作ります。 -
// TODOの行を消して、緑の行を入力します。ch05/Condition.javapackage ch05; public class Condition { public static void main(String[] args) { int age = 14; if (age < 15) { System.out.println("年齢は 15 以上で入力してください"); } System.out.println("年齢:" + age); } } -
保存して実行します。
コンソール年齢は 15 以上で入力してください 年齢:14 -
int age = 14;をint age = 27;に変えて、保存して実行します。今度は年齢:27だけが表示されます。コンソール年齢:27
if (age < 15) { … } は、「age が 15 より小さいときだけ、{ } の中を実行する」という意味です。条件に当てはまらないときは、{ } の中を飛ばして、次の文に進みます。
5.3 条件を表す式
age < 15 のように、2つの値を比べる式の結果は、boolean(true か false)になります。値を比べる演算子を 比較演算子 といいます。
| 演算子 | 意味 | 例(age が 27 のとき) |
結果 |
|---|---|---|---|
== |
等しい | age == 27 |
true |
!= |
等しくない | age != 27 |
false |
< |
より小さい | age < 15 |
false |
> |
より大きい | age > 99 |
false |
<= |
以下 | age <= 27 |
true |
>= |
以上 | age >= 15 |
true |
【ご注意】「等しい」は = ではなく ==
= は代入(第4章)で、== が「等しい」です。if (age = 27) と書くと、「型の不一致: int から boolean には変換できません」というエラーになります。
比較の結果は、boolean の変数に入れることもできます。
boolean adult = age >= 15; // age が 27 なら true
if (adult) {
System.out.println("15 歳以上です");
}
5.4 if 文
if 文には、「当てはまらないときの処理」を else で、「別の条件」を else if で続けられます。
if (条件1) {
条件1 が true のときの処理
} else if (条件2) {
条件1 が false で、条件2 が true のときの処理
} else {
どの条件にも当てはまらないときの処理
}
条件は上から順に調べられ、最初に true になった1つのブロックだけが実行されます。else if と else は、必要なければ書かなくてかまいません。
-
Condition.javaのif文を、緑の行のように書き換えます。ageは27のままにします。ch05/Condition.javapackage ch05; public class Condition { public static void main(String[] args) { int age = 27; if (age < 15) { System.out.println("年齢は 15 以上で入力してください"); } else if (age > 99) { System.out.println("年齢は 99 以下で入力してください"); } else { System.out.println("年齢:" + age); } } } -
保存して実行します。
コンソール年齢:27 -
ageを100に変えて実行すると、年齢は 99 以下で入力してくださいと表示されます。確かめたら27に戻します。
【再確認】{ } は必ず書く
ブロックの中の文が1つだけのときは、{ } を省略して書くこともできますが、この教材では 必ず書きます。省略すると、後から文を足したときに、その文が if の外にあるのに中にあるように見えてしまい、間違いの元になります。Eclipse のフォーマット(Ctrl + Shift + F)をかけても、{ } は自動では付きません。
5.5 論理演算子
「15 以上 かつ 99 以下」のように、条件を組み合わせるには 論理演算子 を使います。
| 演算子 | 意味 | 例 | 結果が true になるとき |
|---|---|---|---|
&& |
かつ(両方) | age >= 15 && age <= 99 |
両方の条件が true のとき |
|| |
または(どちらか) | age < 15 || age > 99 |
どちらか一方でも true のとき |
! |
でない(反転) | !adult |
adult が false のとき |
-
if文を、||を使って1つの条件にまとめます。ch05/Condition.javapackage ch05; public class Condition { public static void main(String[] args) { int age = 27; if (age < 15 || age > 99) { System.out.println("年齢は 15 以上 99 以下で入力してください"); } else { System.out.println("年齢:" + age); } } } -
保存して実行します。
コンソール年齢:27ageを14や100に変えると、エラーのメッセージが表示されます。確かめたら27に戻します。
【知識メモ】Spring入門の入力チェック
Spring入門では、年齢の入力チェックを @Min(15)・@Max(99) という書き方で行います。自分で if 文を書く代わりに、Spring が「15 以上 99 以下」を調べてくれます。ただし、その裏で行われているのは、この章の比較と同じことです。
5.6 switch 文
1つの値が「1 なら男、2 なら女」のように、いくつかの決まった値のどれに当てはまるかで処理を分けるときは、switch 文を使うと読みやすくなります。
switch (値) {
case 値1:
値が 値1 のときの処理
break;
case 値2:
値が 値2 のときの処理
break;
default:
どれにも当てはまらないときの処理
break;
}
-
Condition.javaに、性別を表示するswitch文を書き足します。ch05/Condition.javapackage ch05; public class Condition { public static void main(String[] args) { int age = 27; if (age < 15 || age > 99) { System.out.println("年齢は 15 以上 99 以下で入力してください"); } else { System.out.println("年齢:" + age); } int gender = 2; switch (gender) { case 1: System.out.println("性別:男"); break; case 2: System.out.println("性別:女"); break; default: System.out.println("性別:不明"); break; } } } -
保存して実行します。
コンソール年齢:27 性別:女
| 部分 | 意味 |
|---|---|
switch (gender) |
gender の値で分岐する |
case 1: |
値が 1 のとき、ここから実行する |
break; |
switch 文を抜ける。書き忘れると、次の case の処理まで続けて実行される
|
default: |
どの case にも当てはまらないとき |
【ご注意】break の書き忘れ
case 1: の break; を消して、gender を 1 にして実行してみてください。「性別:男」と「性別:女」の両方が表示されます。break; が無いと、次の case に流れ込むためです。case ごとに break; を書く習慣を付けてください。確かめたら元に戻します。
【知識メモ】Spring入門での性別の表示
Spring入門では、性別の 1・2 を「男」「女」に変える処理を、Java ではなく画面のテンプレート(Thymeleaf の th:switch)で書きます。考え方はこの switch 文と同じです。
5.7 文字列の比較
文字列が等しいかどうかは、== ではなく equals で調べます。文字列の変数.equals(比べる文字列) と書き、等しければ true になります。
-
Condition.javaのmainメソッドの最後に、緑の行を書き足します。ch05/Condition.java(main メソッドの最後)default: System.out.println("性別:不明"); break; } String name = "院照 心愛"; if (name.equals("院照 心愛")) { System.out.println("名前は一致しています"); } else { System.out.println("名前は一致していません"); } System.out.println("名前の文字数:" + name.length()); } } -
保存して実行します。
コンソール(後半)名前は一致しています 名前の文字数:5
name.equals(…) や name.length() のように、変数.名前(…) の形で呼ぶものを メソッド といいます(第7章で詳しく学びます)。String には、文字列を扱うメソッドがいろいろ用意されています。この教材で使うのは次の3つです。
| メソッド | 意味 | 例(name が "院照 心愛" のとき) |
|---|---|---|
equals(文字列) |
文字列が等しければ true
|
name.equals("院照 心愛") → true
|
length() |
文字数 |
name.length() → 5(空白も1文字) |
isEmpty() |
文字が1つもなければ true
|
name.isEmpty() → false
|
【ご注意】文字列に == を使わない
name == "院照 心愛" と書いてもエラーにはなりませんが、同じ内容の文字列でも false になることがあります。== は「同じものを指しているかどうか」を比べるもので、「同じ内容かどうか」は比べないためです(第8章の「参照」で理由が分かります)。文字列の比較には、必ず equals を使ってください。
5.8 null
String の変数には、文字列の代わりに null(ヌル)を入れることができます。null は「何も入っていない」ことを表す特別な値です。空文字列 "" は「文字が0個の文字列が入っている」状態なので、null とは違います。
-
mainメソッドの最後に、緑の行を書き足します。ch05/Condition.java(main メソッドの最後)System.out.println("名前の文字数:" + name.length()); String address = null; if (address == null) { System.out.println("住所は入力されていません"); } else { System.out.println("住所:" + address); } } } -
保存して実行します。最後に、次のように表示されます。
コンソール(最後の行)住所は入力されていません
null かどうかは、== と != で調べます。null が入っている変数に対して address.length() のようにメソッドを呼ぶと、実行したときに NullPointerException というエラーが起きてプログラムが止まります。このエラーは、第8章と第12章で詳しく扱います。
【知識メモ】null を入れられるのはクラスの型だけ
null を入れられるのは、String のようなクラスの型の変数だけです。int や boolean などの基本型には null を入れられません。「数が入っていない」ことを表したいときは、第11章で学ぶ Integer を使います。Spring入門で、社員IDや年齢を int ではなく Integer にしているのは、このためです。
5.9 うまくいかないときは
| 症状 | 考えられる原因と対処 |
|---|---|
| 「型の不一致: int から boolean には変換できません」 |
if (age = 27) のように、== を = と書いています。== に直してください。 |
| 「トークン "else" に構文エラーがあります。このトークンを削除してください」 |
if のブロックを閉じる } と else の間に、別の文が入っています。} else { と続けて書いてください。 |
switch で2つの case の処理が両方実行される |
break; を書き忘れています。各 case の最後に break; を付けてください。 |
文字列が同じなのに == の結果が false になる |
正しい動きです。文字列は equals で比べてください。 |
実行すると NullPointerException と表示されて止まる |
null が入っている変数のメソッドを呼んでいます。== null で調べてから使うか、変数に値を入れてください。詳しくは 付録A「よくある実行時のエラー」 を見てください。 |
ほかのエラーは、付録A「よくあるコンパイルエラー」・付録A「よくある実行時のエラー」 も参考にしてください。
5.10 まとめと確認問題
まとめ
- 比較演算子(
==!=<><=>=)で比べた結果はboolean。「等しい」は== -
if (条件) { } else if (条件) { } else { }。上から順に調べ、最初にtrueになったブロックだけを実行する。{}は必ず書く -
&&(かつ)、||(または)、!(でない)で条件を組み合わせる -
switch (値) { case 値1: … break; default: … }。break;を書き忘れると次のcaseに流れ込む - 文字列は
equalsで比べる。length()は文字数、isEmpty()は空かどうか -
nullは「何も入っていない」。クラスの型の変数にだけ入れられる。== nullで調べる
この章で使った書き方は、付録B「文法早見表」の「条件分岐と繰り返し」 にまとめています。
確認問題
問1 age が 15 以上かつ 99 以下のときに true になる条件式を書いてください。
解答を見る
age >= 15 && age <= 99
問2 次のコードで gender が 1 のとき、何と表示されますか。switch (gender) { case 1: System.out.println("男"); case 2: System.out.println("女"); break; }
解答を見る
男 と 女 の両方が表示されます。case 1: に break; が無いので、case 2: の処理まで続けて実行されるためです。
問3 String name = "大阪府"; のとき、name が "大阪府" と等しいかを調べる正しい書き方はどちらですか。
(a) name == "大阪府" (b) name.equals("大阪府")
解答を見る
(b) です。文字列の内容を比べるには equals を使います。
問4 null と ""(空文字列)の違いを説明してください。
解答を見る
null は「何も入っていない」状態で、"" は「文字が0個の文字列が入っている」状態です。null の変数のメソッドを呼ぶと NullPointerException になりますが、"" なら length() は 0 を返します。
問5 int の変数に null を入れられますか。
解答を見る
入れられません。null を入れられるのはクラスの型の変数だけです。「数が入っていない」ことを表すには、第11章で学ぶ Integer を使います。