if 文last-modified: May/11th/2003; Since: Dec./23rd/2001
条件分岐の代表として、 if 文を紹介します。
条件式を与えて、その条件式が真であればブロックAを、偽であればブロックBを実行します。
if (条件式) {
ブロックA
} else {
ブロックB
}
else 以下は省略可能です。その場合は、条件式が真であればブロックAを実行しますが、偽であれば何もせずに次の行へ制御が進みます。
IfDemo.java:
class IfDemo {
public static void main(String[] args) {
int i = 10;
int j = 5;
System.out.println("Before");
if (i <= j) {
// ブロックA
System.out.println("Win!");
} else {
// ブロックB
System.out.println("Loose!");
}
System.out.println("After");
}
}
上の例では、変数 i に代入された値が j の値以下であればブロックAが実行され、さもなくばブロックBが実行されます。この場合はブロックBが実行される事になります。
C:\Java>javac IfDemo.java C:\Java>java IfDemo Before Loose! After C:\Java>
次のような構文も用意されています:
if (条件1) {
ブロックA
} else if (条件2) {
ブロックB
} else if (条件3) {
ブロックC
} else {
ブロックD
}
else if() のブロックは幾つあっても構いません。また、最後の else ブロックは省略可能です。
この構文では、条件2と条件3の両方に合致する場合でも、条件2のブロックしか実行されません。条件式のブロックを記述する順番を間違えると、正しく働きませんので、注意が必要です。
コマンドラインから引数を一つとります。これを、条件式で 123 と比較して、大きい/小さい/等しいで条件分岐しています。
IDCheck.java:
class IDCheck {
public static void main(String[] args) {
// コマンドライン引数を int 型に変換
int i = Integer.parseInt(args[0]);
// i と 123 の比較
if (i == 123) {
System.out.println("ビンゴ!");
} else if (i < 123) {
System.out.println("足りない!");
} else {
System.out.println("多すぎ!");
}
}
}
Integer.parseInt() は、 Integer クラスのメソッドで、引数にとった文字列を int 型に変換して解釈します。今の場合は、文字列型変数 args[0] に代入された文字列を int 型と解釈して 123 と比べています。
コマンドライン:
C:\>cd java C:\java>javac IDCheck.java C:\java>java IDCheck 100 足りない! C:\java>java IDCheck 200 多すぎ! C:\java>java IDCheck 123 ビンゴ! C:\java>
引数を与えなかったり、二つ以上の引数を与えた場合は、実行時エラー(例外、 Exception)が発生します。折角ですから、コマンドライン引数の個数で条件分岐して、エラーメッセージを用意しておきましょう。
class IDCheck {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("引数を一つ入力してください。");
} else {
int i = Integer.parseInt(args[0]);
if (i == 123) {
System.out.println("ビンゴ!");
} else if (i < 123) {
System.out.println("足りない!");
} else {
System.out.println("多すぎ!");
}
}
}
}
args.length は、配列を参照する変数 args が参照している配列の要素の個数を int 型の値として返します。今の場合は、コマンドライン引数の個数が1つ以外である場合は制御が if ブロックに移り、一つであれば else ブロックに移ります。
if 構造を追加して、目的の値から10以内ならば「ちょっと大きい!」、「ちょっと小さい!」と表示するようにソースを編集/保存して、コンパイル/実行してみてください。
引数から西暦を受け取り、閏年であるかどうかを判定します。閏年の条件は次のように決めます:
class Uruu {
public static void main (String[] args) {
if (args.length!=1) {
System.out.println("西暦を入力してください。");
return;
}
// String 型のコマンドライン引数 args[0] を int 型に変換
int year = Integer.parseInt(args[0]);
boolean bln = false;
if (year%4 == 0) { //4で割り切れる
bln = true;
if (year%100 == 0) { //100で割り切れる
bln = false;
if (year%400 == 0) { //400で割り切れる
bln = true;
}
}
} else {
// false で初期化しているので不要
bln = false;
}
if (bln) {
System.out.println(args[0] + "年は閏年です。");
} else {
System.out.println(args[0] + "年は閏年ではありません。");
}
}
}
% は除算の余りを返す演算子です。
Integer.parseInt(args[0]) は String 型の変数 args[0] に代入されている値を int 型として解釈した値を返します。返された値は左辺の int 型変数 year に代入されています。
C:\Java>javac Uruu.java C:\Java>java Uruu 2000 2000年は閏年です。 C:\Java>java Uruu 2001 2001年は閏年ではありません。 C:\Java>java Uruu 2004 2004年は閏年です。 C:\Java>java Uruu 2100 2100年は閏年ではありません。
これは最も単純な書き方ですが、少し考えると、もっと簡略化することができます。閏年でない条件は、「4で割り切れない」または(「100で割り切れる」かつ「400で割り切れない」)です。したがって、次のように記述できます
class Uruu2 {
public static void main(String[] args) {
if (args.length != 1) {
System.out.println("西暦を一つ入力してください。");
}
int year = Integer.parseInt(args[0]);
if (year%4 != 0 || (year%100 == 0 && year%400 != 0)) {
System.out.println(args[0] + "年は閏年ではありません。");
} else {
System.out.println(args[0] + "年は閏年です。");
}
}
}
|| と && は、それぞれ論理和(又は)と論理積(且つ)のショートサーキット演算子です。
C:\Java>javac Uruu2.java C:\Java>java Uruu2 2000 2000年は閏年です。 C:\Java>java Uruu2 2001 2001年は閏年ではありません。 C:\Java>java Uruu2 2004 2004年は閏年です。 C:\Java>java Uruu2 2100 2100年は閏年ではありません。