if文
if(条件){条件がtureの時の処理;}
- 条件:boolean型になる式にしなければいけない
- 処理する文が1文の場合、{}を省略することができる
以下では、変数ageの値と20が等しいので、if文の処理が実行される。
Training.java
class Training {
public static void main(String[] args){
int age = 20;
if (age == 20){
System.out.println("二十歳です。");
}
}
}
//出力結果:二十歳です。
※3行目をint age = 18;
に変更すると、if文の条件がfalseになるのでif文のブロック内の処理が実行されない。
また、if文ブロック内の処理が1文の場合、{}を省略することができる。
Training.java
class Training {
public static void main(String[] args){
int age = 20;
if (age == 20)
System.out.println("二十歳です。");
System.out.println("これは、if文より外です。");
}
}
//出力結果:二十歳です。
これは、if文より外です。
if~ else文
if(条件){条件がtureの時の処理;}else{条件がfalseの時の処理;}
- 処理する文が1文の場合、{}を省略することができる
以下では、if文の条件がfalseになるので、else文の処理が実行される。
Training.java
class Training {
public static void main(String[] args){
int age = 18;
if (age == 20){
System.out.println("二十歳です。");
}else{
System.out.println("二十歳ではありません。");
}
}
}
//出力結果:二十歳ではありません。
if~ else if文
if(条件A){条件Aがtureの時の処理;}else if(条件B){条件Bがtureの時の処理;}
- 条件:boolean型になる式にしなければいけない
- 処理する文が1文の場合、{}を省略することができる
以下では、if文の条件はfalseになるものの、else if文の条件がtrueになるためelse if文の処理が実行される。
Training.java
class Training {
public static void main(String[] args){
int age = 18;
if (age == 20){
System.out.println("二十歳です。");
}else if(age == 18){
System.out.println("二十歳まで後少しです。");
}else{
System.out.println("二十歳ではありません。");
}
}
}
//出力結果:二十歳まで後少しです。
三項演算子
条件 ? trueの場合返す ; falseの場合返す;
Training.java
class Training {
public static void main(String[] args){
int i = 10;
String s = "iの値は";
s += i > 10 ? "10以上" : "10未満";
System.out.println(s);
}
}
//出力結果:iの値は10未満
※結果は、記号の優先順位に基づいて出力されている
switch文
if文に比べて、多分岐処理が楽に実装できる。
switch(式){case 定数1: 処理1; break; case 定数2: 処理2; default: 処理3;}
- 式:byte, short, int, char, およびそれらのラッパークラス, String, enumのいずれかの値でないといけない。それ以外の型はコンパイルエラー
- switchの式とcase 定数を比較してtrueになれば、そのcaseの処理を実行する。(そのため、式と定数のデータ型に注意)
- 判定がtrueとなり、実行されるcaseにbreakがない場合は、判定関係なく次のcaseの処理が実行される。
No. | 注意点 |
---|---|
1 | 式は、byte, short, int, char, およびそれらのラッパークラス, String, enumのいずれかの値でないといけない。それ以外の型はコンパイルエラー |
2 | 式がnullの場合、コンパイルは成功するが、実行時にNullPointerExceptionエラーが出力される |
3 | case, defaultの終わりはコロン |
4 | break;でswitch文を抜ける |
5 | caseの処理文の最後にbreak;を指定しない場合、判定に関係なく、次のcaseの処理に移り、処理が実行される。 |
6 | どのcaseにも一致しない場合、またはcaseの処理をbreakで終了しない場合に、default:が実行される。defaultの位置は、switch内のどこに記述しても問題ない。 |
7 | case, defaultの処理は{}が不要 |
8 | default:にbreak;は不要 |
以下では、switch文の例を示している。
int i = 1;
にした場合、default:が実行される。
Training.java
class Training {
public static void main(String[] args){
int i = 10;
switch(i){
case 0:
System.out.println("iは、0です。");
break;
case 5:
System.out.println("iは、5です。");
break;
case 10:
System.out.println("iは、10です。");
break; //breakがなければdefaultに移る
default:
System.out.println("iは0, 5, 10ではありません。");
}
}
}
//出力結果:iは、10です。
※case 10:の実行処理にbreak;がないと、default:も実行する。
defaultは、どのcaseに当てはまらない場合に実行されるが、breakがない場合は、次のcaseに移るため実行されることになる。
以下では、注意点⑤の例を示す。
breakがない場合、caseの判定関係なく、処理が実行されていることがわかる。
Training.java
class Training {
public static void main(String[] args){
int[] i_array = {1, 2, 3};
for(int i : i_array){
switch(i){
case 1:
System.out.println("1");
case 2:
System.out.println("2");
break;
default:
System.out.println("Other");
}
}
}
}
//出力結果:
//1
//2
//2
//Other
switch文の式
- 式は、byte, short, int, char, およびそれらのラッパークラス, String, enumのいずれかの値でないといけない。それ以外の型はコンパイルエラー
- 式は、算術でも問題ない
- 式は、変数宣言できない。コンパイルエラーになる。
int i = 2;
switch(i + 10){} //ok
switch(i++){} //ok
switch(int i2 = 10;){} //コンパイルエラー
case 定数:
caseに指定するものは、**定数(= 変わらない数値のこと)でなければいけない。
つまり、定数(final)はok、変数はコンパイルエラーになる。
以下では、case 定数:の例を示す。
- コンパイルエラーの例として以下を紹介している。
- ①定数に、変数を指定した場合。
- ②定数の配列を指定した場合。
②については、配列全体としては、定数として扱われる(つまり、配列自体のメモリアドレスは変えられないということ)が配列の要素自体は変更が可能であるため、コンパイルエラーとなっている。
Training.java
class Training {
public static void main(String[] args){
int i = 10;
final int f_i = 5;
final String[] f_s = {"a"};
switch(i){
case 0:
System.out.println("iは、0です。");
break;
case f_i:
System.out.println("iは、5です。");
break;
case i: //コンパイルエラー
System.out.println("iは、10です。");
break;
case f_s[0]: //コンパイルエラー
System.out.println("iは、10です。");
break;
default:
System.out.println("iは0, 5, 10ではありません。");
}
}
}
//出力結果:コンパイルエラー