スポンサーサイト

  • 2013.11.08 Friday
  • -
  • -
  • -
  • by スポンサードリンク

一定期間更新がないため広告を表示しています


例外オブジェクト(Exception)

例外オブジェクトは次のようなクラス階層を持ちます。

□Object
└□Throwable
 ├□Error
 │├□
 └□Exception
  ├□RuntimeException
  │├□
  ├□

それぞれのクラス(およびそのサブクラス)は次のように分類できます。

クラス 説明
Error JavaVM で検出される致命的エラー。例外ハンドラを記述しても処理を継続できないことが多い。OutOfMemory(メモリ枯渇)など。
RuntimeException Javaの処理上発生するエラー。例外ハンドラは省略可能。ArithmeticException(ゼロ除算)、IllegalArgumentException(引数不正)、NullPointerException(NULLポインタ参照)、ArrayIndexOutOfBoundsException(不正インデックスによる配列参照)など。
Exception 通常の例外。例外ハンドラを記述しないとコンパイルエラーとなる。

例外を投げる(throw, throws)

throw を用いて例外を投げることができます。例外を投げるメソッドを定義する場合は、throws を用いて、そのメソッドが例外を投げる可能性があることを明示しておきます。throws 宣言されたメソッドは、try catch で例外を補足しないと、コンパイル時にエラーとなります。

§ThrowTest.java
class MyException extends Exception {
public String errMsg;
MyException(String msg) { errMsg = msg; }
}

class ThrowTest {
public static void main(String[] args) {
try {
methodA();
} catch (MyException e) {
System.out.println(e.errMsg);
}
}
static void methodA() throws MyException {
MyException e = new MyException("エラー発生!!");
throw e;
}
}


例外をキャッチする(try, catch, finally)

FileReader() は、指定したファイルが存在しない場合に FileNotFoundException 例外を発生させます。これは、FileReader() のマニュアルに下記のように記述してあることから分かります。

public FileReader(String fileName)
throws FileNotFoundException

try は、例外を発生させる可能性のある処理を呼び出す場合に用います。try { ... } の間で例外が発生した場合、catch を用いてこの例外を捕捉します。下記の例では、FileNotFoundException 例外が発生した場合に、その内容を標準出力に書き出します。このような例外発生時の処理を 例外ハンドラ と呼びます。

try {
FileReader in = new FileReader("data.txt");
} catch (FileNotFoundException e) {
System.out.println(e);
}

catch は例外発生時に投げられる 例外オブジェクト に応じて複数記述することができます。いずれの catch にも該当しない例外を扱うために、finally を用います。

try {
:
} catch (TestAException e) {
:
} catch (TestBException e) {
:
} finally {
:
}

例外が発生した場合、try { ... } catch の間の残りの処理はスキップされます。下記の例では、例外が発生した場合 (1) (2) (4) (5) の処理が実行され、(3) の処理はスキップされます。例外が発生しない場合は (1) (2) (3) (5) の処理が実行されます。

System.out.println("(1)");
try {
System.out.println("(2)");
FileReader in = new FileReader("data.txt"); ← 例外発生!!
System.out.println("(3)"); ← スキップされる
} catch (FileNotFoundException e) {
System.out.println("(4)");
}
System.out.println("(5)");


例外とは

Java では、プログラムを実行する最中に発生するエラーを 例外(exception)として扱うことができます。例外には例えば、0で割り算をした、メモリが枯渇した、存在しないファイルを開こうとしたなどがあります。

パッケージのサンプル

下記のようなフォルダ構成でファイルを作成してみます。□はドライブやフォルダ、○はファイルを意味しています。

□ C:¥
└□ java
 ├○ PkgTest1.java
 └□ pkgA
  ├○ PkgTest2.java
  └□ pkgB
   └○ PkgTest3.java

それぞれのファイルの中身を次のように記述してください。

§PkgTest1.java
class PkgTest1 {
public static void main(String[] args) {
pkgA.PkgTest2 o2 = new pkgA.PkgTest2();
pkgA.pkgB.PkgTest3 o3 = new pkgA.pkgB.PkgTest3();
o2.test();
o3.test();
}
}

§pkgA¥PkgTest2.java
package pkgA;

public class PkgTest2 {
public void test() {
System.out.println("this is pkgA.PkgTest2");
}
}

§pkgA¥pkgB¥PkgTest3.java
package pkgA.pkgB;

public class PkgTest3 {
public void test() {
System.out.println("this is pkgA.pkgB.PkgTest3");
}
}

これをコンパイルして実行すると次のようになります。

C:¥java>javac PkgTest1.java
C:¥java>java PkgTest1
this is pkgA.PkgTest2
this is pkgA.pkgB.PkgTest3


パッケージ(package)

パッケージ は、いくつかのクラスやインタフェースをひとまとまりにしたものです。ファイルの先頭で package 文を次のように宣言することで、そのファイルに含まれるクラスなどは、pkgA.pkgB パッケージの一部として定義されるようになります。

package pkgA.pkgB;


インポート(import)

Java において、例えば Button は正確には java.awt.Button と記述します。しかし、毎回 java.awt.Button と記述するのは面倒なため、プログラムの冒頭で java.awt.* を import しておくことにより、java.awt.Button を単に Button と記述できるようになります。

java.awt.Button btn = new java.awt.Button();

上記を、import を用いて書き直すと次のようになります。

import java.awt.*;

Button btn = new Button();


マップ(TreeMap)

TreeMap も HashMap と同じように使用できます。要素がキーによって自動的にソートされる点が HashMap と異なります。

§TreeMapTest.java
import java.util.*;

class TreeMapTest {
public static void main(String[] args) {
TreeMap map = new TreeMap();
map.put("Name", "Tanaka");
map.put("Age", new Integer(26));
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
Object o = it.next();
System.out.println(o + " = " + map.get(o));
}
}
}


マップ(HashMap)

HashMap は、名前(キー)と値の組み合わせを要素として持つ配列です。

§HashMapTest.java
import java.util.*;

class HashMapTest {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("Name", "Tanaka");
map.put("Age", new Integer(26));
System.out.println("Name = " + map.get("Name"));
System.out.println("Age = " + map.get("Age"));
}
}

C:¥java>java HashMapTest
Name = Tanaka
Age = 26

すべての要素を参照するには下記のようにします。

Iterator it = map.keySet().iterator();
while (it.hasNext()) {
Object o = it.next();
System.out.println(o + " = " + map.get(o));
}


セット(TreeSet)

TreeSet も HashSet と同じように使用できます。要素が自動的にソートされる点が HashSet と異なります。

§HashSetTest.java
import java.util.*;

class TreeSetTest {
public static void main(String[] args) {
TreeSet set = new TreeSet();
set.add("CCC");
set.add("AAA");
set.add("BBB");
set.add("AAA");
Iterator it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}

C:¥java>java TreeSetTest
AAA
BBB
CCC