<概要>条件文を学びます。条件式がC言語、C++言語のそれとは微妙に異なるので注意!
●例題4-1 キーボードから入力された降水確率により傘の必要性の有無を表示するプログラム。
○プログラム
import java.io.*;
public class Kasa3{
public static void main(String[] args){
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try{
System.out.println("降水確率を入力して下さい。");
String line=reader.readLine();
int n=Integer.parseInt(line);
System.out.println("降水確率は"+n+"%です。");
if(n<0 || 100<n){
System.out.println("降水確率は 0〜100 の間ですよ。");
}else if(n>=50){
System.out.println("傘を忘れずにね。");
}else{
System.out.println("傘は要りません。");
}
System.out.println("行ってらっしゃい。");
}catch(IOException e){
System.out.println(e);
}catch(NumberFormatException e){
System.out.println("数字の形式が正しくありません。");
}
}
}
○実行結果
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
-10
降水確率は-10%です。
降水確率は 0〜100 の間ですよ。
行ってらっしゃい。
-- Press any key to exit (Input "c" to continue) --
-- Input "exit" to exit from CommandPrompt --
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
50
降水確率は50%です。
傘を忘れずにね。
行ってらっしゃい。
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
30
降水確率は30%です。
傘は要りません。
行ってらっしゃい。
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
150
降水確率は150%です。
降水確率は 0〜100 の間ですよ。
行ってらっしゃい。
D:\atsushi\Java\List4-3>java Kasa3
降水確率を入力して下さい。
12.3
数字の形式が正しくありません。
D:\atsushi\Java\List4-3>
○解説
3. BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
8. String line=reader.readLine();
これらは前章で解説しましたが、簡単に復習しましょう。
長くてよく分からない3行目の一文は、
データの読み込みを行う為の変数を宣言しているんだ、
くらいに考えておけば大きく違いはしないでしょう。
String は文字列を表すクラスです。
どうやら無尽蔵に文字列を保存できるみたい!?
char 型配列に四苦八苦していたC言語、C++言語プログラマは嬉しくて涙が出ちゃう反面、
内部構造を考えると怖くて涙が出ちゃいますね……。
readLine メソッドは文字列を1行分取得するメソッドです。
11. if(n<0 || 100<n){
13. }else if(n>=50){
15. }else{
条件式の型は boolean 型(論理型)です。
これがC言語、C++言語との違いであり、重要な点です。
例題4-2、例題4-3で詳しく解説します。
それ以外は、C言語、C++言語と一緒。
9. int n=Integer.parseInt(line);
line に 12.3 という文字列が入っていた場合どうなるでしょうか?
小数を切り捨てて 12 という int 型数値が得られるでしょうか?
実行結果を見て下さい。
10行目以降の処理を中断して、
21. catch(NumberFormatException e){
22. System.out.println("数字の形式が正しくありません。");
23. }
まで直ちにジャンプしています。
これより、Integer.parseInt メソッドはその引数に
int 型と見なせる文字列以外が渡された場合は例外として処理する、ということが分かります。
★ブロック
if(n<0 || 100<n){
System.out.println("降水確率は 0〜100 の間ですよ。");
}else if(n>=50){
System.out.println("傘を忘れずにね。");
}else{
System.out.println("傘は要りません。");
}
と
if(n<0 || 100<n)
System.out.println("降水確率は 0〜100 の間ですよ。");
else if(n>=50)
System.out.println("傘を忘れずにね。");
else
System.out.println("傘は要りません。");
は、同じ意味です。
これまでのプログラムは全て、わざわざ { } で囲んでいますが、
Java言語においても、必ず { } で囲まなければいけない、という規則は無いみたいですね。
●例題4-2 if( n ) はJava言語の文法として正しいですか?( n は int 型変数)
○答え 正しくない。コンパイルエラー。
○コンパイル
■D:\atsushi\Java\List4-3> javac Kasa3.java
Kasa3.java:11: 互換性のない型
検出値 : int
期待値 : boolean
if(n){
^
エラー 1 個
○解説
C言語、C++言語プログラマには衝撃ですが、
0 以外は真、0 は偽とは見なしてくれません。
エラーメッセージにもあるように、条件式の型は boolean 型(論理型)です。
boolean 型以外の式を boolean 型とする為には、比較演算子を用いましょう。
また、無理矢理 int 型を boolean 型にキャストしようとしたら
「変換できない型」というエラーメッセージが表示されました。
●例題4-3 if( !n ) はJava言語の文法として正しいですか?( n は int 型変数)
○答え 正しくない。コンパイルエラー。
○コンパイル
■D:\atsushi\Java\List4-3> javac Kasa3.java
Kasa3.java:11: 演算子 ! は int に適用できません。
if(!n){
^
エラー 1 個
○解説
! 演算子は論理の反転を意味します(「演算子と優先順位」参照)。
このエラーメッセージより、! 演算子は boolean 型にしか適用できないことが分かりますね。