No.13

オブジェクト指向プログラミング
13回目:パッケージ,import,例外処理
情報メディア学科
濱本和彦
本日の内容
パッケージ
import
システム定義のパッケージとimport
例外処理
パッケージ
「パッケージ」とは,「クラスやインタフェースの集まり」のこ
とです。
1つのソースファイルに含まれるクラスやインタフェースを1
つにまとめることが出来ます。
つまり,複数のファイル(クラスやインタフェース)をまとめ
て一つのパッケージとし,そのパッケージを利用してプログ
ラムを書く,ということができます。
パッケージに含まれるファイルは,パッケージ名と同じフォ
ルダの中になければなりません。階層構造も可能です。
あるファイルを,あるパッケージに含む場合は,最初の行
に次のように記述します。
package パッケージ名;
パッケージ
パッケージpの作成と利用
フォルダ名とパッケージ名は同じ
フォルダp
A.java
B.java
Example70.java
package p;
package p;
package p;
class A{
void a1( ){
System.out.println("a1");
}
}
class B{
void b1( ){
System.out.println(“b1");
}
}
class Example70{
public static void main(・・・・){
A a = new A( ); a.a1( );
B b = new B( ); b.b1( );
}
}
パッケージに含まれるファイルは
そのフォルダの下に配置する
同一パッケージ内であれば,
他のファイルで宣言された
クラスの利用も可能
パッケージ:演習
パッケージを指定しない場合は,既定のパッケージに割
り当てられます。
Visual Studioの場合,プロジェクト名がパッケージ名に
相当します。

プロジェクトを作成したとき,その名前のフォルダが自動的に作ら
れます。
pという名前のプロジェクトを作成し,そこに「追加」「既存
の項目」からA.java, B.java, C.java, Example70.javaを
選択,追加してください。
pという名前のフォルダが作成され,4つのファイルが追
加されていることを確認してください。
Example70.javaをビルド・実行して,A.java, B.java,
C.javaで宣言されているクラスからオブジェクトを作成,
実行できることを確認してください。
import文
同じパッケージ内のクラスやインタフェースは,直
接それらを利用することが出来ます。
では,別のパッケージ内のクラスなどを利用する
にはどうすればよいでしょうか?
import文を利用します。あるパッケージ内のすべ
てのクラス等を利用できるようにするためには,
次のように指定します。
import パッケージ名.*;
import:演習
新規にsという名前のプロジェクト(パッケー
ジ)を作成し,そこにD.javaとE.javaを追加
してください。クラス,メソッドともpublic指
定になっていることに注意して下さい。
「プロジェクト」の「プロパティ」から,「出力
の種類」として「クラスライブラリ」を指定し
ます。
ビルドすると,s.dllというライブラリが作ら
れます(s\bin\Debugフォルダ内)。
import:演習
先に作成したプロジェクト
pを開いてください。
「プロジェクト」から「参照
の追加」を選択し,s.dllを
追加してください。
Example70.javaに,右の
ように追記してください。
ビルド・実行して,パッケ
ージsのクラスDとEが利
用できることを確認してく
ださい。
パッケージsをimportしな
い場合にクラスDとEを使
うにはどうしたらよいでしょ
うか?
package p;
import s.*;
class Example70{
public static void main(String args[]){
A a = new A(); a.a1();
B b = new B(); b.b1();
C c = new C(); c.c1();
D d = new D(); d.d1();
E e = new E(); e.e1();
}
}
システム定義のパッケージと
import
Javaでは,様々なクラスがパッケージとして整理されてお
り,これらをimportすることでいろいろなプログラムを作る
ことが出来ます。
パッケージ
説明
java.awt
GUIを作成するAbstract Window Toolkitのクラス群
java.awt.event
AWTコンポーネントからのイベントを処理するクラス群
java.applet
アプレットを作成するクラス群
java.io
入出力動作を扱うクラス群
java.lang
Javaの中核的な機能を提供するクラス群
java.net
ネットワーク機能を提供するクラス群
※java.langパッケージは最も重要なパッケージなので,自動的に取り込まれます。
Javaのパッケージの利用
Example71.java, Example72.java,
Example73.javaは,java.ioパッケージを
用いてキーボードからの入力を可能にした
プログラム例です。
実行して動作を確認してください。
try{・・} catch{・・}は例外処理と呼ばれる部
分です。詳しくはこの後解説します。
例外処理
「例外」とは,プログラム実行中に発生した問題を通知す
るために,実行時に生成されるオブジェクトのこと
Javaのエラーチェックの仕組み



エラー(例外)が発生
「例外オブジェクト」が生成されて
例外情報が表示され,プログラムの実行が停止される
例外が発生する典型的なケース



ゼロで除算した
配列のインデックスが負の数,または配列の領域を超える値だっ
た
ファイルが見つからなかった
プログラムの構造を堅牢かつ分かり易くする
Java既定の例外処理の例
Example74.javaは,「整数値をゼロで除算して故意に算
術例外を発生させる」プログラムです。
実行すると以下のメッセージが表示され,実行が停止し
ます。
算術例外オブジェクトの生成
例外の種類の表示
例外を生成した
java.lang.ArithmeticException: 0 で除算
メソッドがどこか
場所 Example74.d() 場所 C:\....\Example74.java:行 27
ら呼び出された
場所 Example74.c() 場所 C:\....\Example74.java:行 20
のか確認
場所 Example74.b() 場所 C:\....\Example74.java:行 15
場所 Example74.a() 場所 C:\....\Example74.java:行 10
場所 Example74.main(String[] args) 場所 C:\....\Example74.java:行 5
ユーザが用意する例外処理
tryステートメント
Example73.javaを見てみましょう
try{
・・・
・・・
}
例外の発生を監視する必要があるソースコード。
例外が発生したら「例外オブジェクト」を生成して実行を停止し,
処理できる(例外オブジェクトを受け取ってくれる)catchブロックを探す
例外の種類:Java.ioパッケージ内のIOExceptionクラス,入出力の問題を表す
catch (IOException e) { 入出力の問題(IOExceptionクラスのオブジェクト)をcatchしたら・・
System.out.println("IOエラーが発生しました。");
}
catchブロックで指定した処理が実行される。この場合はメッセージを表示する
catch (NumberFormatException ne) {
System.out.println("入力された数値が正しくないようです。");
}
RuntimeExceptionクラスのサブクラス。RuntimeExceptionはExceptionクラスのサブクラス。
Java.langパッケージ内に定義,実行時に整数の形式が不正である問題を表す
エラーチェックを途中に埋め込む必要が無い!!
例外処理の例
Example75.javaは,ゼロで除算しようとした際に発生す
るArithmeticException例外時の処理をcatchブロックで
定義している例です。
他に,コマンドライン引数が足りない例外,引数の形式が
整数でない例外についてのcatchブロックが定義されて
います。
動作を確認してください。





二つのコマンドライン引数の内,二つ目を0にしてみましょう
コマンドライン引数を無し,または1つだけにしてみましょう
コマンドライン引数に実数や文字を指定してみましょう
二つのprintln()がどのように実行されているか確認しましょう
catchブロックのprintln()で,catchブロックが受け取った例外オブ
ジェクトを直接表示してみましょう
例外処理の例
Example75.java
try {
起こる可能性がある
例外について,その
対策を作っておく
例外処理1
例外処理2
例外処理3
System.out.println("program start");
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
System.out.println(i / j);
System.out.println("program end");
例外が起こる可能性がある
範囲をtry{ }で囲む
例外が起こったら・・
}
catch (ArithmeticException e) {
その例外に対応した
処理を探して実行する
System.out.println("算術例外の発生");
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("配列の添え字がデータがある範囲を超えました");
}
catch (NumberFormatException e) {
System.out.println("引数の形式が整数ではありません");
}
Exceptionクラスとサブクラス
Exceptionクラス:実行時に発生する可能性がある例外のスーパークラス
ClassNotFoundExceptionクラス
クラスが見つからなかった例外
NoSuchMethodExceptionクラス
メソッドが見つからなかった例外
・・・・
RuntimeExceptionクラス
実行時に発生する頻度が高い例外
ArithmeticExceptionクラス
算術例外の発生
ArrayIndexOutOfBoundsExceptionクラス
配列の添え字が実在しない要素を指していた
・・・・
演習
Example76.javaを実行すると,どんな情報が表示される
でしょうか?
インタフェースの参照を利用する次のようなプログラムを
作成しなさい(Problem13.java)。






LuminousObjectインタフェースでは,lightOff()メソッドと
lightOn()メソッドを宣言します。
ConeクラスとCubeクラスはSolidObjectクラスを拡張します。
LuminousConeクラスはConeクラスを拡張し,LuminousObject
インタフェースを実装します。
LuminousCubeクラスはCubeクラスを拡張し,LuminousObject
インタフェースを実装します。
LuminousConeクラスとLuminousCubeクラスをインスタンス化
します。
これらのオブジェクトを参照するためにインタフェースの参照を使
い,LuminousObjectインタフェースのメソッドを呼び出すようにし
なさい。