第9回Java勉強会 †
概要 †
パッケージ †
アクセス修飾子 †
例外処理 †
ガベージコレクション †
詳細 †
パッケージ †
- パッケージとは
- クラス名の衝突を防ぐために用意されたグループ分けの仕組みです。
- クラス名が同じであってもパッケージが異なっていれば異なるクラスとして扱うことができます。
- import宣言
アクセス修飾子 †
どのクラスがパッケージの外から使えるのかとか、どのメソッドが使えるのかということを指定するもの。
クラス名、メソッド名、フィールドにつけることができます。
- アクセス制御の種類
- public
他のパッケージからのアクセスを許可する修飾子
- protected
自のパッケージおよびサブクラスからのアクセスを許可する修飾子
- 修飾子を付けない
アクセス範囲をパッケージ内に制限
- private
アクセスできる範囲をクラス内のみに制限
- クラスとインターフェースに対してはpublicを付けるか、何もつけないかのどちらかしかアクセス制御できません
- クラスがpublicでなければメソッドをpublicにしても他のパッケージからは使用できません。
- クラスのメソッドとフィールドについてのアクセス制御一覧
| 修飾子 | publicクラス | publicでないクラス |
| private | クラス内でのみ使える |
| なし | 同じパッケージからのみ使える |
| protected | 同じパッケージとサブクラスからのみ使える | 同じパッケージからのみ使える |
| public | 他のパッケージから使える | 同じパッケージからのみ使える |
- インターフェースのメソッドとフィールドについてのアクセス性御一覧
| 修飾子 | publicインターフェース | publicでないインターフェース |
| private | (指定できない) |
| なし | 他のパッケージから使える | 同じパッケージからのみ使える |
| protected | (指定できない) |
| public | 他のパッケージから使える | 同じパッケージのみから使える |
例外処理 †
例外(Exception)処理とは、プログラムで起こったエラーを適切に処理するための機構です。
- Throwableクラスとは
Throwableは例外処理のおおもととなるクラスです。ErrorクラスとExceptionに分けられます
- Errorクラス
実行時にプログラムを継続することを期待できないときに投げられるクラスです。
(メモリ不足など)
- Exception
例外処理を行って動作が継続することを期待するときに投げられるクラスです。
(配列の要素外にアクセス、ファイル処理でファイルが見つからない場合など)
こちらはさらにRuntimeException?とそれ以外のExceptionに分けられます。
- エラー処理を実装するtry~catch~finally
例外処理コードの書き方は、例外が起こりえる場所をtryブロックで囲み、catchブロックで例外(Exception)毎の処理を実装します。
以下の3種類のブロックが例外に対する処理のブロックです。
- tryブロック
例外が起こりそうな場所を囲みます。
- catchブロック
- 例外が発生した際のエラーを処理するブロックです。例外(Exception)をキャッチ(catch)するためのブロックです。
- catchブロックは複数記述することができます。
- catchブロックは上から順にチェックされていきます。
下の例でいうと、まずは「例外の種類1」であるかが判定されます。そうであれば、「例外に対する処理1」が実行されます。
そうでなければ、「例外の種類2」がチェックされます。
- finallyブロック
例外が発生しようとも、しなかろうとも最終的に到達するブロックです。
どんな場合でもかならず行いたい処理を記述しておきます。
try {
} catch (例外の種類1) {
} catch (例外の種類2) {
} finally {
}
- 例外処理のサンプルコード
- 文字列から整数値に変換するときの例外処理を記述します。
ファイル名:NumberTest?.java
public class NumberTest {
public static void main(String[] args) {
try {
String str = "hogehoge";
int num = Integer.parseInt(str);
System.out.println(num);
} catch (NumberFormatException e) {
System.out.println("NumberFormatExceptionをキャッチしました");
e.printStackTrace();
} finally {
System.out.println("finally の処理");
}
}
}
- 複数の例外を処理します。
ファイル名:MultiException?.java
public class MultiException {
public static void main(String[] args) {
try {
String str = "123";
int num = Integer.parseInt(str);
System.out.println(num);
int[] array = new int[5];
System.out.println(array[10]);
} catch (NumberFormatException e) {
System.out.println("NumberFormatExceptionをキャッチしました");
e.printStackTrace();
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("ArrayIndexOutOfBoundsExceptionをキャッチしました");
e.printStackTrace();
} finally {
System.out.println("finally の処理");
}
}
}
- 例外を投げるthrow
作成したクラスなどで例外を発生させたい場合にはthrowを使用します。
if (flag) {
} else {
throw new IOException();
}
- throws
メソッド内で例外を発生させる可能性がある場合はthrowsを使用することができます。
エラー処理はプログラムの深いところでは処理せずに、throwsで呼び出し元に投げるほうて上層部で処理をしたほうがよいでしょう。
以下の例は、throwSampleメソッドでIOExceptionが発生する可能性があることを示します。
public void throwSample() throws IOException{
}
- 独自の例外クラスを作成する
業務などに応じて、独自の例外クラスを作成することができます。
継承したいExceptionクラスを指定して、サブクラスとして独自の例外クラスを定義することができます。
- 独自の例外クラスを作成し、使用するサンプルです。
ファイル名:CustomException?.java
public class CustomException extends Exception {
public CustomException(String msg) {
super(msg);
}
}
独自の例外を発生するメソッドを作成する
ファイル名:TestClass?.java
public class TestClass {
public void throwSample(int n) throws CustomException{
if (n > 50) {
System.out.println("正常時の処理が行われました");
} else {
throw new CustomException("独自の例外");
}
}
}
作成した独自例外クラスをthrowします。
ファイル名:TestMain?.java
public class TestMain {
public static void main(String[] args) throws CustomException {
int num = 20;
try {
TestClass test = new TestClass();
test.throwSample(num);
} catch (CustomException e) {
e.printStackTrace();
throw e;
}
}
}
ガベージコレクション †
ガベージコレクションとは、使用されなくなった変数の使用しているメモリ領域を掃除する仕組みです。
Java勉強会カリキュラムに戻る