第4講:もっともシンプルな「時間割表示システム」を拡張する

その1 「授業の情報」のキーボード入力を受付させる(1)

 ここから先はすでに完成済みのもっともシンプルな「時間割表示システム」を拡張してゆきます。まずはじめに、「ClassInfo.java」のメイン・メソッドを書き換えて、「授業の情報」をキーボードから入力できるようにします。ここでは、そのために必要な「BufferedReaderクラス」の利用方法と「入力エラー」への対処法などのJavaプログラムに関する知識を中心に学習します。

(1) 「授業の情報」のプログラム外部からの入力

 今のところ「ClassInfo.java」が表示する「授業の情報」は、あらかじめプログラムの中に書き込まれていました。このままだと、もしも情報の内容を変更したい場合などには、プログラムのファイルに直接変更を加えなければならず、扱う情報の量が増えた場合などには大変不便になります。できればプログラム自身とそれが扱う情報とは分けておきたいものです。

 そのためにはプログラムが、プログラム自身の外部に保存された情報の入力を受け付けるようにしなければなりません。外部からの入力先としては、プログラムとは別に情報だけが保存されている「ファイル」からの入力と、人間が打ち込む「キーボード」からの入力という二つが考えられます。

 そこでまずは今回外部からの情報の入力方法として、キーボードからの入力を受け付ける方法を学びます。具体的にはプログラムを起動したときに「時限」「科目名」「教室名」の入力をキーボードからユーザー自身に行わせ、そのとき入力された内容をオウム返しにディスプレイに表示させるように「ClassInfo.java」を書き換えます。

(2)BufferedReaderによるキーボード入力の実現

 キーボードからの入力を実現するには、前回の講座で説明した「クラスライブラリ」に用意されているBufferedReaderクラスを利用すると便利です。このクラスにはキーボードから入力される情報を文字列として受け取ることのできる「readLine」というメソッドが用意されているからです。これから、その利用方法を学習します。

 まずはじめに、BufferedReaderクラスを利用するために、プログラムのいちばん始め(「public class〜」よりも先に)に次のような記述をします。
import java.io.*;

 これは「BufferedReaderクラス」を始めとするデータの入出力に関連するクラスライブラリ(パッケージともいう)を利用することの宣言です。

 さて「readLine」メソッドを利用するためには、その準備としてBufferedReaderクラスをインスタンス化しなければなりません。これまでに学習した内容に従うと、インスタンス化のための書式はこうでした。
XXX インスタンス名 = new XXX();

 たとえば「ClassTableクラス」をインスタンス化するときには、このように書いていました。
ClassTable info1= new ClassTable();

 基本的にはこの書式に従えば、BufferedReaderクラスをインスタンス化することができるわけです。ただし注意しなければならないのは、BufferedReaderの場合、一部だけ上の書式とは異なる部分があるのです。キーボード入力を実現するためにBufferedReaderをインスタンス化するには以下のように記述します。
BufferedReader インスタンス名 = new BufferedReader( new InputStreamReader(System.in));

 ポイントは緑で示した「new InputStreamReader(System.in)」の部分の記述です。この部分の記述は「どこからの入力を実現したいのか」をBufferedReaderクラスに教えるための情報であると考えて下さい。BufferedReaderインスタンス化の際に、「new BufferedReader()」の()内に「new InputStreamReader(System.in)」と書かれている場合は、「キーボード入力のための準備」をしているのです(では、BufferedReaderにそれ以外の入力先も想定できるのかといえば、答えはYesです。テキストファイルからの入力です。しかしここではやりません)

 ところでインスタンス化がすんだら、
インスタンス名.readLine();

 と記述すれば、キーボードから入力される情報を文字列で受け取る「readLineメソッド」を利用することができます。ただしこのままでは、せっかく「readLine()」を実行することによって受け取られた文字列を、どうすることもできません。そこで、このメソッドを実行する際には、必ず「代入文」の右辺においてやり、左辺には「文字列型」の変数を用意しておいてやります。つまり、
String x;
x = インスタンス名.readLine();

 と記述してやるわけです。すると、上の例でいえば「x」の中に、キーボードから入力された文字列が代入されます。このように、あるメソッドに処理を実行させたときに、何らかの「処理の結果の値」(この場合だとキーボードから入力された文字列)がプログラム中のメソッドの呼ばれた場所に返されるとき、その値のことを特に「返値(かえりち)」と呼びます。

(3)入力エラーへの対処

 キーボード入力の命令(readLineメソッド)を実行する場合には、何らかの原因による「入力エラー」発生の可能性があります。例えばキーボードのケーブルがコンピュータからはずれていたり、キーボードの上に物がのっかっていてキーがずっと押された状態になってしまい過大な量の情報が入力されたりと、いろいろな可能性が考えられるのです。Javaではこうしたメソッドの操作が想定していない緊急事態を「例外」として定義し、もしも「例外」が起こった場合プログラムを終了するなど何らかの対処を施せるしくみを用意しています。そして、「readLine」のように「例外」が起きる可能性のあるメソッドを起動する場合、そのしくみとワンセットで使用することを義務づけています。

 例えば以下の緑字の書式に従うと、「readLine」で例外が発生した時点でプログラムの処理が中断され「例外が起きた場合に実行する命令」を行ってプログラムが終了します。例えばエラーが発生したことをユーザーに知らせるメッセージの表示等です。このようにしておけば、万が一のプログラムの暴走が防げます。
try{

	例外の可能性のあるメソッドを記述
	x = y.readLine();

}catch(Exception e){例外が起きた場合に実行する命令;}

 メイン・メソッドを始め、自分でメソッドの処理手順を記述して定義する際に、その手順の一つとしてこのような「例外」の可能性を含むメソッドの利用がある場合には、以下のようにメソッド名の定義の後すぐに「try{ }」で処理手順全体を囲むと安全です。
public class A{
	public static void main(String args[]){

		try{

			例外の可能性のあるメソッドを記述
			x = y.readLine();

		}catch(Exception e){例外が起きた場合に実行する命令;}

	}

}


リンク:

<全体のトップページ>

     |

<第4講のトップページ>

     |-------------------------|

<第4講・その1>       <第4講・その2>