キーボードから1文字入力

とりあえず

キーボードから文字を入力するには、System.in.read() というメソッドが使えます。

ファイル名 KeyInput.java (これはまだ不十分です)

次のようにします。

public class KeyInput {
    public static void main(String[] args) {
       int  i;
       System.out.println( "文字キーを押してください" );
       i = System.in.read();
       System.out.print( "あなたが押した文字キーは " + (char)i + " です。");
       System.out.println( "その文字コードは " + i + " です。" );
    }
}

System.in.read() はキーボードから入力された文字をチェックして1文字取り込みます。ただし、返すのは文字そのものでなく、文字コード(文字につけられた番号)です。

これを int の i に代入しています。このまま表示すると文字コードになってしまうので、(char)i で文字コードに対応する文字に直しています。

しかし、これだけではコンパイルは通りません。

$ javac KeyInput.java
.\keyinput.java:7: 例外 java.io.IOException は報告されません。
スローするにはキャッチまたは、スロー宣言をしなければなりません。
       i = System.in.read();
                         ^
エラー 1 個

改良

キーボード入力中に例外(普通の言語ではエラー)がおきて、プログラムを続けられなくなったときの処理を書かなければならないといっているのです。

キャッチまたは、スロー宣言をするように書いてありますが,ここではキャッチをつかいましょう。

ファイル名 KeyInput.java

次のようにします。

import java.io.*;
public class KeyInput {
    public static void main(String[] args) {
       int  i;
       System.out.println( "文字キーを押してください" );
       try{
           i = System.in.read();
           System.out.print( "あなたが押した文字キーは " + (char)i + " です。");
           System.out.println( "その文字コードは " + i + " です。" );
       }
       catch(IOException e){
           System.err.println( "入力エラーです。" );
       }
    }
}

青い部分が書き加えた部分。赤い部分は元からある部分のうち、例外が起きる可能性のある部分と例外が起きたら実行する意味のなくなる部分です。この部分を try の { } の中に入れてしまいます。問題がなければ次の catch の部分は実行されません。

catchの部分には,ここで起こる可能性のある例外が java.io.IOException であるとメッセージにあるので,( )の中に IOException e と書いておきます。これは引数で,エラーの詳細を IOException クラスのインスタンス e にいれて受け取るということを表しています。e は好みのインスタンス名にしてもいいのですが,習慣で e とするのが普通です。

この IOException を使うためには、最初に、import java.io.* と書いておく必要があります。javaにはたくさんのクラスやメソッドがあり、最初から全部使うことにしておくとコンパイルに時間がかかります。そこで使うクラスやメソッドだけを指定して組み込むようにしてあります。import はそのための記述です。

正常に実行されると次のようになります。もっとも、キーボード入力では、例外があることはめったにおきません。

$ java KeyInput
文字キーを押してください
a
あなたが押した文字キーは a です。その文字コードは 97 です。

課題

1.

改良された KeyInput.java をつくり実行してみなさい

ファイル名 KeyInput.java

入力の最後にはEnterが必要です。何文字入力しても最初の1文字だけが処理されます。(正確には1バイトなので日本の文字は半分しか処理されません)

次の課題のために"z"が122であることを確認しておきましょう。

2.

KeyInput.java をさらに改良し、繰り返し入力をして文字と文字コードを表示するようにしなさい。"z"を押すと終了するようにしなさい。

回数が決まっていない繰り返しなのでwhileを使います。

try{...}, catch{...} 両方をひとつの while(...){.....} の中に入れるのがいいでしょう。

「"z"を押すと終了」は i が122でなければ繰り返すと考えるのが簡単になります。while( i != 122 )。実際にやってみておかしければ改良していきます。

ファイル名 KeyInput2.java

この入力も行ごとの入力になるのでやはり Enter キーの入力が必要です。 Enter キーの入力後それまでに入力された文字が全部処理されます。

$ java KeyInput2
文字キーを押してください
abcd
あなたが押した文字キーは a ですその文字コードは 97 です。
あなたが押した文字キーは b ですその文字コードは 98 です。
あなたが押した文字キーは c ですその文字コードは 99 です。
あなたが押した文字キーは d ですその文字コードは 100 です。
 ですその文字コードは 13 です。
あなたが押した文字キーは
 ですその文字コードは 10 です。

最後の13と10は Windows における改行で,Enter キーで入力されたものです。13は カーソルを行頭にもどし,10は改行(次の行にすすめること)をします。

z を入力するまで入力を待ち続けます。

ABCD
あなたが押した文字キーは A ですその文字コードは 65 です。
あなたが押した文字キーは B ですその文字コードは 66 です。
あなたが押した文字キーは C ですその文字コードは 67 です。
あなたが押した文字キーは D ですその文字コードは 68 です。
 ですその文字コードは 13 です。
あなたが押した文字キーは
 ですその文字コードは 10 です。
xyz
あなたが押した文字キーは x ですその文字コードは 120 です。
あなたが押した文字キーは y ですその文字コードは 121 です。
あなたが押した文字キーは z ですその文字コードは 122 です。

大文字と小文字で文字コードが異なること。z の後は無視されることがわかります。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified