この章ではキーボードから入力された値を受け取る方法について学習します。
では例をみてみましょう。 この例はキーボードから整数を入力するプログラムです。
初めに以下のようにをインポートします。
次にScannerクラスの引数にを記述します。
と書くとキーボードから値を読み込みます。
ここで、画面が入力待ち状態になるので、何らかの値を入力します。
int型の値を読み込むのであればのようにという構文で記述します。
入力したあとにリターンキーを押すと入力が完了します。
の場合はint型の値以外の値を入力するとエラーになりますので気を付けてください。
この例では2回読み込んでいるので、2回入力を行っています。 入力したもの同士を足しているので、結果は以下のようになります。 int型以外の型の値を入力したい場合は次のように記述します。 もう一つ、ユーザーに入力させる方法があります。
この星座を判定するプログラムは学習済みですので、全文は載せませんが見直しておいてください。 ユーザーに入力してもらうには以下のような形式でBufferedReaderクラスを使います。
BufferedReaderクラスは1行ずつテキストを読み込みます。
スペースの都合で2行で書いていますが、通常は1行で書きます。 BufferedReaderの引数にはInputStreamReaderクラスを指定します。
InputStreamReaderクラスも文字テキストを読み込むクラスです。
InputStreamReaderクラスの引数にを指定しているので、キーボードから文字列を読み込みます。
BufferedReaderクラスもテキストを読み込むクラスですがBufferedReaderクラスを使う時にはInputStreamReaderクラスも一緒に使います。
理由はJavaTM Platform, Standard Edition 6で調べると分かりますが、読み込む効率が良くなるのでスピードが速くなります。 BufferedReaderクラスを使用するためには冒頭でと入力します。
次の箇所でBufferedReaderクラスのメソッドを使って読み込んだものをweに代入しています。 次の箇所は読み込んだものが文字列なので、これをint型の整数値に変換しています。 JavaTM Platform, Standard Edition 6でBufferedReaderクラスを検索すると次のようにBufferedReaderクラスで使えるメソッド一覧を確認できます。
タグ: BufferedReader
例外処理について知ろう
この章では例外処理について説明します。
例外処理については少し説明しましたが、例えば数字を入れなくてはいけない場面で数字以外のものが入れられたら、「数字の入力が必須です」と例外処理が実行されます。
説明済みの星座のプログラムを見てみましょう。結果は以下の通りです。 例えばこのプログラムで数字以外のaなどを入力すると「数字入力」と出力されます。
コマンドプロンプトで入力する場合には例え3などと入力しても文字列を入力していることになるので、これをで整数に変換するわけですが、この時、aなどのように数値に変換できない文字列形式の場合には例外が発生します。
例外が発生するとcatch以降のブロックに実行が移ります。 例外が発生する状況はこの数字以外以下のようなケースが考えられます。
〇例えば配列の要素数を5つで宣言したにも関わらず6つ目にデータを入れようとしたとき
〇ファイルを開くときにそのファイル自体が見つからなかったとき
〇 0で割り算をしたとき
〇メモリを消費しすぎて、足らなくなったとき
では配列の例外の例を見てみましょう。 この例は配列の要素数を3つで宣言しているのにそれを超えた添え字にデータを入れようとしたので例外が発生します。
例外の流れはブロックの中で例外が発生するとcatchのブロックに処理が移ります。
発生した例外が catchの引数の例外クラスと一致していた場合、catchブロック内に処理が移ります。
しかし例外が発生したとしてもcatchの中のという例外に一致したものでないと例外処理が行われません。
一致したのならばcatchの中のeに例外の内容が入ります。
は例外処理を行うクラスになります。
JavaTM Platform Standard Edition 6 APIを見ますと配列のサイズを超えた場合にその例外をスローしてくれるクラスと書いてあります。
JavaTM Platform Standard Edition 6 APIはとても便利なので分からないことがありましたら参考にしてください。
どんなに経験のあるプログラマでもすべてのクラスを把握するのは不可能なので、このJavaTM Platform Standard Edition 6 APIは手放すことはできません。 例外が成功したのならば と正常に例外をキャッチ出来ていることが分かります。
このように例外処理を行うことでプログラムが途中で終わってしまうことを防ぐことが出来ます。
以下の例では例外を使っていませんので、途中で強制終了させられます。 出力結果は以下の通りです。 もちろん、すべての配列の箇所で例外処理を行っていては例外処理だらけになってしまうので、例外が発生しそうな箇所だけ例外処理を施すのがいいでしょう。
では他の例外クラスの説明をします。
星座の例のNumberFormatExceptionはNumberFormatExceptionというクラスであり、文字列を整数に変換するときに、aなどのように数値に変換できない文字列の形式の場合に例外が発生します。
次はIOExceptionクラスについて説明します。
IOExceptionクラスはコマンドライン入力やファイル入力などの入出力の時に発生する例外に対して例外処理を行うクラスです。
先ほどのSeizaクラスの中にBufferedReaderクラスがありますが、このクラスはIOExceptionの例外を発生する可能性がありますので、必ず例外処理でキャッチする記述をしないといけません。 例外処理をしないと以下のエラーが表示されます。
では次の例に進みます。 ArithmeticExceptionクラスは0で割ろうとしたときに発生する例外です。 結果は次の通りです。 では次の例に進みます。 Exceptionクラスはすべての例外クラスの親クラスになります。
ですので、例えばArithmeticExceptionクラスが行っている例外処理も上の例のようにExceptionクラスで代用することが出来ます。
次はメソッドの中で例外が発生した時の例外処理の方法について説明します。 tryのブロックの中でhairetsuメソッドを呼んでいます。
もしhairetsuメソッドの中で例外が発生する可能性があるのならば例のようにメソッド名の右横にを付け加えます(この例ではスペースの都合で2行に分けて書いています)。
この例の場合には配列の要素数を超えた添え字にデータを入れようとしているので例外が発生します。
例外が発生したのならばmainメソッドに戻って例外処理を行います。
結果は以下のようになります。
if文で星座を判定しよう
この章ではif文で星座の判定を書いてみましょう。
ユーザーに誕生月と誕生日を入力させて、それに対して星座を出力するプログラムです。
ここで使っているif文は入れ子になっています。
つまり、if文の中にif文が入っている構造になっています。
また、ユーザーに入力させるにはBufferedReaderクラスを使うのですが、BufferedReaderクラスの説明は「キーボードの入力の値を受け取ろう」の章で説明します。
では例をみてみましょう。
少し長いですが、if文が繋がっているだけです。 この章はif文の学習なのでBufferedReaderクラスやreadLineについては理解しなくても結構です。
BufferedReaderクラスについては「キーボードの入力の値を受け取ろう」の章で説明します。
ユーザーに入力してもらう仕組みは以下のBufferedReaderクラスが行います。
紙面の都合で2行で書いていますが、1行で書いても結構です。 さらにBufferedReaderクラスを使用するためにはブログラムの冒頭にと書きます。
importは他のファイルを取り込む時に使用します。
では次の箇所の説明をしますが、この章はifの学習ですので、この時点で理解する必要はありません。 =>この箇所はユーザーが入力したものをlineに代入しています。
つまり、この箇所でプログラムが入力待ちの状態になるので、好きな数値を入力します。
例えば以下の通り、1と、入力しますとこの1がlineに代入されます。
readLineは1行のテキストを読み込むという意味になります。
では次の箇所の説明をします。 =>この箇所はキーボードから入力したデータをint型の整数値に変換しています。
先ほど1という数値を入力したのに、なぜまたint型整数に変換しているのかというと、コマンドプロンプトで入力したのは実際には数値ではなく、という形式の文字列です。
ですので、この文字列を整数値に変換する必要があるのです。
int型の整数値に変換する方法は以下の通りです(これらはクラスやメソッドといわれるものを使用しているので、今は分からなくても結構ですが、構文は覚えておいてください)。 この例では2か所でreadLineを使って、誕生日の日と月を入力させています。
ではif文の説明に入ります。
これからif文の入れ子について説明します。
この例では外側のif文でmonthの数値が1から12までのどの数値なのかを確認します。
次に内側のif文で入力させたdayの値により分別をします。
例えば1月は山羊座か水瓶座なので,1月19日までが山羊座で、1月20日からが水瓶座になります。
ですので、入れ子の中の条件式は「&&」で連結して、という表現で書きます。 どれにも当てはまらない時には「間違い」が出力されます。
このように内側のif文は外側のif文での条件をさらに絞りたい場合に使用します。
つまり、入力された月は1月なので、さらに入力された日をもとに山羊座か水瓶座のどちらかを調べましょうと言うことです。
次は以下の説明ですが、この箇所は「例外処理について知ろう」の章で説明しますので、ここではわからなくて結構です。
簡単に説明しますと、ここは例外処理と呼ばれるものです。
つまり、この例では数字以外のものが入力されたらと出力されます。
例外処理は文字通り、数値以外のものが入力されたなどの予想以外の動作が行われた際の処理です。 今は例外処理を分からなくてもいいですが、構文を書いておきます。
詳しくは「例外処理について知ろう」の章で説明します。 これで星座判定の説明は終わりますが、
結果は例えば以下のように表示されます。