[PR] 迷惑メール トップページプロ3ゼミJavaJava入門講座一学期単位3 →3時間目

3時間目 ユーザからの入力に柔軟に対応する

3−3−1.ユーザからの入力

 これまで学んできたプログラムはすべてプログラム上のデータでした。
それでは値を変えるたびにコンパイルしなければならず書き直すのに厄介でした。
これから学ぶのは、コマンドプロンプトからデータを入力し、それを変数に記憶させて処理を行います。
それから習いたてのif文、if〜else文及びその組合せを使いユーザの要求に柔軟に対応できるようにします。

Sample3_3_1を実行して、処理を確かめてください!
Sample3_3_1.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// import java.io.*;                        // java.ioをまとめてインポートする場合              

public class Sample3_3_1 {
    public static void main(String[] args) {
        new KeyInput1().view();
    }
}

class KeyInput1 {
    void view() {
        // InputStreamReaderオブジェクトを作成
        InputStreamReader isr = new InputStreamReader(System.in);
        // BufferedReaderオブジェクトを作成する
        BufferedReader br = new BufferedReader(isr);

        System.out.print("入力->");
        // キーボードからのデータを文字列として受け取る
        String str = null;
        try {
            str = br.readLine();            // ここで入力を受け取る
        } catch (IOException e) {
            System.err.println("入力に失敗しました。");
        }
        // 入力成功したときにだけ出力
        if (str != null) {
            System.out.println("出力:" + str);
        }
    }
}
入力->適当に入力
出力:適当に入力

プログラムを実行すると「入力->」が出力されます。
ここは、「System.out.print()」の処理部分ですので「入力->」が出力されます。
次に、Sample3_3_1の実行結果には太文字部分がありますが、これはキーボードからの入力です。
入力して「Enter」キーを押下すると「出力:適当に入力」が出力されます。
それは「str」に代入され、出力部分で出力されています。

 Sample3_3_1を見て最初に気づくのが「import…」の連続でしょう。
これは、キーボードからの入力に必要な機能をインポートさせています。
Javaプログラマは、機能をインポートする事により簡単にコマンドプロンプトからの入力ができるようになります。
コメントアウトしてある「import java.io.*;」は、java.ioに関する機能の全部(*)をインポートする事を意 味しています。

 Sample3_3_1では、オブジェクトを2つ作成していますが、「br.readLine();」を使う事により入力した文字列を 「String」型から取得できます。
読み込む前後にtry〜catch文を使っていますが、これを書かないとコンパイルエラーとなります。
try〜catch文は、例外処理といいtryの中で発生した例外をcatchで受け取るという文です。
例外処理の説明は後述しますが、これによって入力するときに例外が起きてもプログラムが終了せずに済みま す。

 「if (str != null) {…}」の部分は、例外が発生したら「str」には値が代入されないので、初期値である 「null」と比較し「null」でなければ出力させています。

3−3−2.一般的な書き方

 Sample3_3_1で紹介した方法は、「InputStreamReader」のオブジェクトを作成して、「BufferedReader」に渡し ています。
これを2つではなく一つにまとめて書く事が一般です。
そのときに、「InputStreamReader」は無くなります。
「InputStreamReader」単独では使う事が少ない為に一緒にするのです。
その例のSample3_3_2を見てください!

Sample3_3_2.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;       

public class Sample3_3_2 {
    public static void main(String[] args) {
        new KeyInput2().view();
    }
}

class KeyInput2 {
    void view() {
        // 1つにまとめ宣言
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("入力した値が偶数か奇数かを判断する");
        System.out.print("入力->");
        // キーボードからのデータを文字列として受け取る
        String  str;
        int     integer;
        try {
            str = br.readLine();
            integer = Integer.parseInt(str);                    // int型に変換
            
            if (integer % 2 == 0) {
                System.out.println("入力した値は偶数ですね");
            } else {
                System.out.println("入力した値は負数ですね");
            }
        } catch (IOException e) {
            System.err.println("入力に失敗しました。");
        } catch (NumberFormatException e) {
            System.err.println("変換に失敗しました");
        }
    }
}
入力した値が偶数か奇数かを判断する
入力->1234
入力した値は偶数ですね

 入力部分の宣言は、説明したとおり1つにまとめています。
この書き方を覚えておきましょう。
Sample3_3_2は、入力した値を偶数か奇数かを判断して、その状況に応じて出力しています。
Sample3_3_1でも示したように、キーボードからの入力はString型です。
String型は、文字列な為「%」演算子が使えません。
そこで「Integer.parseInt()」に文字列を渡す事で、int型に変換してくれます。
ここでint型に変換できない場合は「integer = Integer.parseInt(str)」の部分で中断され、 「NumberFormatException」に処理が渡されます。

 Sample3_3_2は、偶数か奇数かの判断と出力をtryブロックの中で書いています。
途中で例外が発生すればtryを抜けるので実行される事がなく、tryの中に書いても問題が無いわけです。


単位2 ソースの基本に戻る     4時間目 柔軟なプログラムを書くには(switch文)に進む

単位3 判断が分かるときはに戻る

トップページ に戻る