これまでのプログラムではプログラム中で処理するデータを直接プログラム中に書き込んでいました。この形式のプログラムでは処理したいデータを変更するにはいちいちプログラムを書き換えてコンパイルしなおす必要があり、非常に面倒です。そこで処理に必要なデータをプログラムの外部から読み込む形式にすればさまざまなデータに対応できます。
ここでは、プログラム実行中にキーボードなどからのデータ入力に対応する方法を示します。
画面への出力に比べ入力はちょっと面倒になります。
次のプログラムはキーボードから商品の価格データを受け取り、その消費税分の金額を出力するものです。
// インポート 入出力などの機能を利用するために必要
import java.io.*;
import java.text.*;
class Shohizei {
public static void main(String args[]){
// 変数宣言
// Kingaku : 入力された金額を記憶する
// Zei : 計算した消費税額を記憶する
double Kingaku, Zei;
// 入力ストリームなどのオブジェクト作成
InputStreamReader ISR = new InputStreamReader(System.in);
BufferedReader BR = new BufferedReader(ISR);
DecimalFormat DF = new DecimalFormat();
System.out.print("金額を入力してください:");
// 入力と変換
try {
String s = BR.readLine();
Number Num = DF.parse(s);
Kingaku = Num.doubleValue();
}
// 例外発生に対する対処
catch (IOException e) { Kingaku = 0.0; }
catch (ParseException e) { Kingaku = 0.0; }
// 消費税の計算
Zei = Kingaku * 0.05;
// 消費税額の表示
System.out.print("消費税:" + Zei + "円です。");
}
}
これまでのプログラムに比べ、非常に長くなっています。入力と入力データの処理がプログラムの大半を占めています。
処理の流れは次のようになります。
Javaでは入出力されるデータの流れをストリームと呼んでいます。ここでは文字ストリームを使っています。文字ストリームを使うと文字コードの種類を意識することなく文字データの入出力ができます。
ストリームを利用するにはパッケージjava.ioが必要です。
ストリームでは数値も文字として扱われるので数値として入力するには文字から数値への変換が必要です。
キーボードから入力されたデータをプログラム中から数値データとして利用するには次の手順を経ます。
InputStreamReader ISR = new InputStreamReader(System.in);
BufferedReader BR = new BufferdReader(ISR);
DecimalFormat DF = new DecimalFormat();
String s = BR.readLine();
Number Num = DF.parse(s);
Kingaku = Num.doubleValue();
1と2は次のように一つにまとめる事ができます。
BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));
入力のときに想定していないデータが入力されたとき(たとえば数値データが必要なときに文字データを入力してしまったなど)、プログラムは正しく動作しなくなります。このような想定している状態とは異なる状況を例外といい、それに対する処理が例外処理です。
Javaでは入力処理を行うときに必ず例外処理を行うようにプログラムを書かなければなりません。もし、それを怠るとソースプログラムのコンパイル時にエラーが発生します。
このプログラムの場合、ストリームからの文字列入力、文字列の数値変換、数値をdouble型に変換する部分が該当します。
例外処理の対象となる部分は次のようにtry {〜}で指定し、例外処理はcatch {〜}で指定します。
try {
例外処理の対象となる文
}
catch (例外名){ 例外処理 }
catchはその名前のとおり、指定された例外を捉える部分です。
このプログラムでは次の二つの例外を検出し、変数Kingakuに0.0を代入しています。