ホームページへ戻る
 

上へ戻る
 

       Java 応用  その1     by H.Y       3月 21 19:04:45 JST 2002



目次

1。例外処理(Exception)
1ー1。例外処理の実装
1)例外処理のないプログラム
2)例外処理のあるプログラム
1ー2。メソッド内での例外
1)メソッド内に、例外処理が実装されていない時
2)メソッド内に例外処理が実装されている時
1ー3。例外を投げる
1)メソッドの例外処理ルーチン内で、例外を投げる
2) try 文の中で,例外を投げる
1ー4。例外発生の可能性を明示する
1ー5。独自の例外クラスを作る
2。複数のオブジェクト
2ー1。Date クラス
2ー2。Calendar クラス
2ー3。Randam クラス
2ー4。Vector クラス
2ー5。Hashtable クラス(連想配列)
2ー6。Enumration インターフェイス(列挙型)
3。ファイルの扱い
3ー1。ストリーム(Stream)
1)ストリーム クラス、File クラス の階層図
3ー2。文字ストリーム
1)InputStreamReaderクラス
2)FileReaderクラス
3)BufferedReaderクラス
4)OutputStreamWriterクラス
5)FileWriterクラス
6)BufferedWriter クラス
7)PrinterWriterクラス
3ー3。バイトストリーム
1)FileInputStreamクラス
2)FilterInputStreamクラス
3)BufferedInpuntStreamクラス
4)DataInputStreamクラス
5)FileOutputStreamクラス
6)FilterOutputStreamクラス
7)BufferedOutputStreamクラス
8)DataOutputStreamクラス
9)PrintStreamクラス
3ー4。File クラス
4。シリアライゼーション
=========================================================================================

1。例外処理(Exception)
プログラムのバグその他によって引き起こされる問題が例外で、その処理が例外処理である。
例外処理の基本的な記述は、次の通りである。
==================================
try {
処理; //例外の発生を検出すべき処理を記述する。
}
catch (例外クラス1 変数名) {
例外処理;
}
catch (例外クラス2 変数名) {
例外処理;
}

finally{
共通処理;
}
=================================
try 文の中の 処理中に問題が発生した場合に、例外が投げられる。例外の種類により
それぞれに、例外クラスがある。この例外クラスは catch 文によって定義された例外のみを
、例外クラス名の後にある変数名によって、受け取る。例外に対応した catch 文の中のみが
実行される。
finnaly 文の中は、例外が発生した場合のみに実行される。従って、例外の共通処理を書く。

try 文には、少なくとも1つの catch 文 または finally 文 が必要である。

1ー1。例外処理の実装
1)例外処理のないプログラム
------------- ExceptionTest1.java ----------------------------
class ExceptionTest1{
public static void main(String args[]){
int i = 10, j = 0, k;
k = i / j;
System.out.println("k = " + k);
}
}
--------- 実行結果 ---------------------------------------------
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionTest1.main(ExceptionTest1.java:5)

2)例外処理のあるプログラム
------------ ExceptionTest2.java -----------------------------
class ExceptionTest2{
public static void main(String args[]){
int i = 10, j = 0, k;

try{
k = i / j; //除算による Exception
System.out.println("k = " + k);
}

catch(ArithmeticException e){ // e で受け取る
System.out.println("除算エラー(0で除算)!");
System.out.println("例外 : " + e); //例外の表示
}
}
}
------------- 実行結果 ------------------------
除算エラー(0で除算)!
例外 : java.lang.ArithmeticException: / by zero

1ー2。メソッド内での例外
1)メソッド内に、例外処理が実装されていない時
try 文内で呼び出したメソッドで例外が発生した場合は、メソッドの呼び出し元に例外が返さ
れる。このため、メソッド呼び出し元の catch 文で例外が受け取られる。
----------- ExceptinTest4.java ------------------------------------------------
class ExceptionTest4{
public static void main(String args[]){
int i = 10, j = 0, k;

try{
System.out.println("befor Methoed");
//メソッド呼び出し
k = calc(i, j); //このメソッドで例外が発生する
System.out.println("after Method");
System.out.println("k = " + k);
}
catch(ArithmeticException e){
System.out.println("Call side Exception Process");
System.out.println("Exception :" + e);
}
}
public static int calc(int i, int j){
int ans;
ans = i / j; //例外はここで発生する
return ans;
}
}
-------------- 実行結果 ---------------------------------------------
befor Methoed
Call side Exception Process
Exception :java.lang.ArithmeticException: / by zero
2)メソッド内に例外処理が実装されている時
メソッド内に例外処理が実装されているときは、メソッド内の例外は、メソッド内でのみ
処理処理される。メソッド内の例外処理が終了すると、メソッドの呼び出し元には、正常に
終了したものとして、戻る。
--------------- ExceptionTest5.java -----------------------------------
class ExceptionTest5{
public static void main(String args[]){
int i = 10, j = 0, k;

try{
System.out.println("メソッド前");
//メソッド呼び出し
k = calc(i, j); //このメソッドで例外が発生するが
System.out.println("メソッド後"); //この行も実行する。
System.out.println("k = " + k);
}
catch(ArithmeticException e){
System.out.println("main内の例外処理");
System.out.println("Exception : " + e);
}
}

public static int calc(int i, int j){
int ans = 999;
try{
ans = i / j; //ここで例外発生
}
catch(ArithmeticException e){
System.out.println("メソッド内の例外処理");
System.out.println("Exception : " + e);
}
return ans;
}
}
---------------- 実行結果-------------------------------
メソッド前
メソッド内の例外処理
Exception : java.lang.ArithmeticException: / by zero
メソッド後
k = 999

1ー3。例外を投げる
呼び出したメソッドで例外が発生した場合に、メソッドでの例外処理の後で、さらに呼び出
し元でも例外処理を実行するためには、呼び出されるメソッド側で throw でさらに例外を投げ
る。
=================================
throw 例外クラスのインスタンス
=================================
例外クラスのインスタンスは、Throwable クラスのサブクラスのインスタンスでなければなら
ない。
1)メソッドの例外処理ルーチン内で、例外を投げる
------------------ ExceptionTest6.java ------------------------
class ExceptionTest6{
public static void main(String args[]){
int i = 10, j = 0, k;
try{
System.out.println("メソッド前");
//メソッド呼び出し
k = calc(i, j); //このメソッドで例外発生
System.out.println("メソッド後");
System.out.println("k = " + k);
}
catch(ArithmeticException e){
System.out.println("main内の例外処理");
System.out.println("Exception : " + e);
}
}

public static int calc(int i, int j){
int ans = 999;
try{
ans = i / j;
}
catch(ArithmeticException e){
System.out.println("メソッド内の例外処理");
System.out.println("Exception : " + e);
throw e; //例外を投げる
}
return ans;
}
}
------------- 実行例 -------------------------------------------
メソッド前
メソッド内の例外処理
Exception : java.lang.ArithmeticException: / by zero
main内の例外処理
Exception : java.lang.ArithmeticException: / by zero
2) try 文の中で,例外を投げる
---------------- ExceptionTest7.java (参考)------------------------
import java.io.*;

class ExceptionTest7{
public static void main(String args[]){
try{
System.out.println("例外前");
throw new IOException();
}
catch(IOException e){
System.out.println("例外が発生しました。");
System.out.println("Exception : " + e);
}
}
}
------------ 実行例 -------------------
例外前
例外が発生しました。
Exception : java.io.IOException

1ー4。例外発生の可能性を明示する
例外を呼び出し元に投げる可能性のあるメソッドは、例外を投げる可能性を明示することがで
きる。
================================================
戻り値 メソッド名(引数) throws 例外クラス {
メソッドの処理;
}
================================================
クラスで、例外を投げる可能性がある場合も、明示できる。
===============================================
クラス名(引数) throws 例外クラス {
処理;
}
==============================================
---------------- ExceptionTest8.java (参考)-----------------
class ExceptionTest8{
public static void main(String args[]){
int i = 10, j = 0, k;
try{
System.out.println("メソッド前");
//メソッド呼び出し
k = calc(i, j);
System.out.println("メソッド後");
System.out.println("k = " + k);
}
catch(ArithmeticException e){
System.out.println("呼び出し元の例外処理");
System.out.println("Exception : " + e);
}
}

public static int calc(int i, int j) throws ArithmeticException{
int ans;
ans = i / j;
return ans;
}
------------------ 実行結果---------------------------
メソッド前
呼び出し元の例外処理
Exception : java.lang.ArithmeticException: / by zero

1ー5。独自の例外クラスを作る
独自の例外クラスを作成する場合は、 Exceptionクラスのサブクラス、または
RuntimeExceptionクラスのサブクラスとして作成する。
--------------- ExceptionTest9.java 参考 ------------------------
class ExceptionTest9{
public static void main(String args[]){
int i = 2;
try{
calc(i);
}
catch(ProgrammerException e){
System.out.println("Exception : " + e);
}
}
public static void calc(int i){
if(i >= 0){
System.out.println("i = " + i);
throw new ProgrammerException("0以上例外");
}
else{
System.out.println("i = " + i);
throw new ProgrammerException("0より小さい例外");
}
}
}

class ProgrammerException extends RuntimeException{
public ProgrammerException(String message){
super(message);
}
}
-------------- 実行結果---------------------------
i = 2
Exception : ProgrammerException: 0以上例外
呼び出されたスレッドで、例外を投げているので、呼び出し元で catch されている。

2。複数のオブジェクト
2ー1。Date クラス
Java で日付や時間を扱うには、java.util パッケージの Date クラス、Calendarクラス、
GregorianCalendarクラスを使う。
[課題]
参考資料 Dateクラスを参照のうえ、下記表示を出力するプログラムを作成せよ。
--------------DateSample1.java 実行結果------------------
現在の時刻 Thu Mar 21 17:13:31 JST 2002
基準時 : Thu Jan 01 09:00:00 JST 1970

2ー2。Calendar クラス
年、月、日 といった日付の情報や、時、分、秒と言った時刻の情報を操作することが出来る。
-------------- CalendarSample1.java -----------------------
import java.util.*;

class CalendarSample1{
public static void main(String args[]){
int year, month, date, hour, minute, second, dayofweek;
String days[] = {"日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日",
"土曜日"};
//Calendarオブジェクトの取得
Calendar now = Calendar.getInstance();
//日付の出力
System.out.println(now.getTime());
year = now.get(now.YEAR);
month = now.get(now.MONTH) + 1; //MONTH = 0,...,11
date = now.get(now.DATE);
hour = now.get(now.HOUR);
minute = now.get(now.MINUTE);
second = now.get(now.SECOND);
dayofweek = now.get(now.DAY_OF_WEEK) - 1; //DAY_OF_WEEK = 1,...,7
//書式を付けて日付を出力
System.out.println(year + "年" +
month + "月" +
date + "日 " +
hour + "時" +
minute + "分" +
second + "秒 " +
days[dayofweek]); //day[0]=日曜日,...., day[6]=土曜日
}
}
------------- 実行結果---------------
Thu Mar 21 17:24:46 JST 2002
2002年3月21日 5時24分46秒 木曜日
--------------------------------------

2ー3。Randam クラス
乱数を扱うクラスである。Randam クラスは int ,long, float, double の各型の乱数
を生成する。
(1)Randam() で生成すると、現在の時刻をシード(種)にして乱数を生成し、返す。
(2)Randam(long seed) は、seed を基に乱数を生成し、返す。

乱数を生成するには、Mathクラスの random()メソッドでも生成できる。このメソッドは
Randomクラスの nextDouble()メソッドと同じ動作をする。

------ 参考資料 Randam クラスを参照のこと -------------

[課題] Math.randam() を使って乱数を発生させるプログラムを作成せよ。

2ー4。Vector クラス
配列は、要素数が固定されてしまうが、Vectorクラスは、必要に応じてサイズを変更できる。
この可変長の配列を ベクトル と呼ぶ。
(1)Vector() コンストラクタでは、デフォルトの要素数が 10 のベクトルが作成される。
(2)Vector(int IniEle) では、IniEle 個の要素のベクトルが作成される。
(3)Vector(int IniEle,int Inc) では、初期値が IniEle に指定された個数の Inc 単位で増減
するベクトルが作成される。

------ 参考資料 Vector クラス を参照のこと --------------

--------- VectorTest1.java --------------------------------------
import java.util.*;

class VectorTest1{
public static void main(String args[]){
//Vectorクラスの生成
Vector vector = new Vector();

//ベクトルの要素数の表示
System.out.println("ベクトルサイズ : " + vector.capacity()); //要素 10

//値の格納
vector.addElement(new Integer(10)); //ラップクラス
vector.addElement(new String("Hello"));
vector.addElement(new Float(20.0f));

//ベクトルの表示
System.out.println(vector);

//要素の挿入
String s = new String("Java");
vector.insertElementAt(s, 2);

//ベクトルの表示
System.out.println(vector);

//要素の削除
vector.removeElementAt(0);

//ベクトルの表示
System.out.println(vector);
}
}
----------------------------
ベクトルサイズ : 10
[10, Hello, 20.0]
[10, Hello, Java, 20.0]
[Hello, Java, 20.0]
-----------------------------------------------------------------------
[課題] 下記表示を得るためのプログラムに変更せよ。for ループを使うこと。
( get, size メソッド)
------------------------------------
ベクトルサイズ : 10
[今日は , 吉永 , 早百合 , さん !]
今日は 吉永 早百合 さん !

2ー5。Hashtable クラス(連想配列)
連想配列(Hashtable)とは、[キー] と [値] のセットを複数持ったテーブルのこと。
配列の要素は、 0 から順に インデックス値によって値が決まる。ハッシュテーブルでは、
キーを目印に値を取り出す。キーはハッシュテーブル内で一意でなくてはならない。

--------- 参考資料 Hashtable クラス を参照のこと --------------

1)例題
------------- HashSample1.java -----------------------
import java.util.*;

class HashSample1{
public static void main(String args[]){
//ハッシュテーブルの作成
Hashtable ht = new Hashtable();
//値の代入
ht.put("sato", "65");
ht.put("yamada", "98");
ht.put("suzuki", "59");
ht.put("saito", "71");
ht.put("Mori", "42");
//値の参照
System.out.println("key = yamada, value = " + ht.get("yamada"));
}
}
2)課題 以下の機能をもつ Java プログラムを作成せよ。
(1)プログラム名を HashSample2.java とする。
(1)受講生の姓と名を持つクラスを作成し、これを name クラスにする。
(2)ハッシュテーブルオブジェクト ht を作る。
(3)この ht に受講生全員の姓名を追加する。即ち、キーワードは、性になる。
(4) java HashSample 性 を実行して、 このハッシュテーブルから、性に対応する
姓名を表示させる。

2ー6。Enumration インターフェイス(列挙型)
Enumrationインターフェイスは、列挙されたものを扱うインターフェイスである。
このインターフェイスは、ベクトルはハッシュテーブル等の、オブジェクトの集まりに対して
処理を行うときに使用する。Vectorクラス と Hashtableクラス には、列挙を返すメソッドが
あるので、それらのメソッドで返された列挙にたいして、次のメソッドを使う。
========================================================================
返り値 | メソッド |
------------------------------------------------------------------------
boolean | hasMoreElements() | 列挙のなかに要素があるときに、真を返す
object | nextElement() | 列挙の中の次の要素を返す
------------------------------------------------------------------------

----------------- HashSample2.java -------------------------------
import java.util.*;

class HashSample2{
public static void main(String args[]){
Hashtable ht = new Hashtable();

ht.put("sato", "65");
ht.put("yamada", "98");
ht.put("suzuki", "59");
ht.put("saito", "71");
ht.put("mori", "42");

Enumeration e = ht.keys();
while(e.hasMoreElements()){
Object k = e.nextElement();
System.out.println("key = " + k + ", value = " + ht.get(k));
}
}
}
----------------- 実行結果----------------------
key = mori, value = 42
key = saito, value = 71
key = sato, value = 65
key = yamada, value = 98
key = suzuki, value = 59

3。ファイルの扱い
3ー1。ストリーム(Stream)
JVM に出入りする情報はすべて、ストリームと言う情報の流れとして捉える。即ち全ての
入出力は、ストリームとして考えることができる。ファイルも読み書き時は、ストリームとして
取り扱うことが出来る。このストリームを取り扱うには java.io パッケージを利用する。

Java.io パッケージを大きく分けると,次のようになる。
---------------------------------------------------------------------------------
|入力ストリーム |出力ストリーム |
---------------------------------------------------------------------------------
文字ストリーム | Readerクラス | Writerクラス | 2 バイト単位
バイトストリーム | InputStreamクラス | OutputStreamクラス | 1 バイト単位
---------------------------------------------------------------------------------
1)ストリーム クラス、File クラス の階層図
Object(Java.lang.Object)
|
(java.io)
| (abstract)
|----- Reader ------ BufferedReader
| |
| ---- InputStreamReader ---- FileReader(File名を指定できる)
| バイト-> 文字
| (abstract)
|----- Writer -------- BufferedWriter
| |
| | ---- OutputStreamWriter --- FileWriter
| | 文字 ->バイト
| |
| ----- PrintWriter(int,float,double型 -> String型)
|
| (abstract)
|---- InputStream ---- FileInputStream
| |
| |-- FilterInputSteam ----- BufferedInputStream
| | |
| | --- DataInputStream
| |
| -- ObjectInputStream
|
| (abstract)
|---- OutputStream ---- FileOutputStream
| |
| |-- FilterOutputSteam ----- BuffeedrOutputStream
| | |
| | |--- DataOutputStream
| | |
| | --- PrintStream
| |
| -- ObjectOutputStream
|
---- File

3ー2。文字ストリーム
文字の入出力を表す。
(1)Readerクラス
(2)Writerクラス
を使う。このクラスは、直接使うのではなく、クラスを構築するための基礎にする。
1)InputStreamReaderクラス
このクラスは、バイトのストリームを、文字のストリームに変換する機能を持っている。
キー入力を詠み取るには、このクラスの read メソッドを使って詠み取る。
コンストラクタは、引数にストリームを取る。
2)FileReaderクラス
コンストラクタでファイル名を指定することが出来る。
ファイルから読み取るための、文字ベースのストリームを生成するときに使う。
3)BufferedReaderクラス
文字ストリームをバッファ(Buffer)に入れて処理を高速化するためのクラスである。
ReadLine メソッドを備えているので、行単位の読み取りに便利。
コンストラクタの引数には、Readerクラスまたはサブクラスのストリームを指定する。
また、2番目の引数でバッファサイズを指定できるコンストラクタも、用意されている。
4)OutputStreamWriterクラス
文字のストリームをバイトストリームに変換するためのクラス。
コンストラクタでエンコーディング方式を指定する。
5)FileWriterクラス
ファイルへ出力するためのクラス。
6)BufferedWriter クラス
Bufferを使った出力処理。バッファーにまとめて書き出す、バッファの内容を強制的に
ファイルに書き出すには flush() メソッドを使う。
7)PrinterWriterクラス
このクラスは、print(), println() メソッドを実装している。これらのメソッドは、
int, float, double型等を時動的に String型に変換して出力する。

3ー3。バイトストリーム
バイトを扱うためのストリームで、主なものには、
(1)InputStream
(2)OutputStream
があるがともに抽象クラスである。
1)FileInputStreamクラス
ファイルからの読みとりを行うときに用いるクラス。コンストラクタは、ファイルの
絶対パスか、Fileオブジェクトを引数にとる。
2)FilterInputStreamクラス
入力ストリームにフィルターをかける。コンストラクタの引数は、入力ストリームを取る。
このクラスは、BufferedInputStreamクラスとDataInputStreamクラスに共通機能を提供する
クラスと考えられる。
3)BufferedInpuntStreamクラス
バイトストリームからの入力を、バッファーにいれて効率化する。
mark(), reset() メソッドにより、バッファに格納された入力ストリームの中で、前の位置に
戻ることが出来る。
4)DataInputStreamクラス
バイトストリームから、Java の基本データ型で、データを読み取る。
5)FileOutputStreamクラス
バイナリーデータをファイルに出力する。
6)FilterOutputStreamクラス
出力ストリームにフィルターの機能と追加したもの。このクラスは直接使われることはあま
りない。サブクラスの、BufferedOutputStream か DataOutputStreamクラスを用いる。
7)BufferedOutputStreamクラス
バイト出力ストリームへの出力を、バッファにいれ効率化したもの。バッファの内容を強制
的にファイルに書き込む場合は flush() メソッドを実行する。
8)DataOutputStreamクラス
バイトストリームへ、Java の基本型でデータ出力することが出来る。
9)PrintStreamクラス
Print(), Println()メソッドを実装している。これらのメソッドは、int,float,double型等
を、自動的に String型に変換して出力する機能を持っている。様々なデータ型を出力する時に
共通のメソッドとして使用する。

3ー4。File クラス
ファイルやディレクトリを扱うのに使用するクラス。
ファイルやディレクトリの
(1) 存在確認
(2) 読み取り・書き込みの許可
(3) ファイルパス、最終変更日時等の操作や参照
を実行できる。

4。シリアライゼーション
オブジェクトをストリームに書き込み、それを元通りに読み込む操作のこと。
シリアライズするオブジェクトは Serializable インターフェイスを実装していなければ
ならない。このインターフェイスは、フィールド、コンストラクタ、メソッドをもっておらず、
オブジェクトがシリアライズ可能なことを示すだけである。

---- 参考資料 ObjectInput/OutputStream クラス 参照のこと --------