第9回Java勉強会

概要

パッケージ

  • 下-P.192

アクセス修飾子

  • 下-P.106

例外処理

  • 下-P.78

ガベージコレクション

  • 下-P.126

詳細

パッケージ

  • パッケージとは
    • クラス名の衝突を防ぐために用意されたグループ分けの仕組みです。
    • クラス名が同じであってもパッケージが異なっていれば異なるクラスとして扱うことができます。
  • import宣言
    • 使用するパッケージを宣言できる
    • 何個でもかける。
  • package宣言

アクセス修飾子

どのクラスがパッケージの外から使えるのかとか、どのメソッドが使えるのかということを指定するもの。
クラス名、メソッド名、フィールドにつけることができます。

  • アクセス制御の種類
    • 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に分けられます。
       
      • RuntimeException?
        実行中に起こり、コンパイラによってチェックされない。
        以下のコードはRuntimeException?の発生例です
        確認したいExceptionのコード部分のコメントを解除して、ひとつずつ確認してください。
        public class ExceptionTest {
        
            public static String str;
            
            /**
             * RuntimeExceptionの発生サンプルです
             * 全ての処理がコメントアウトしてますので、確認したい例外のコメントをはずして
             * ひとつずつ確認してください。
             */
            public static void main(String[] args) {
                
                
                // ゼロでの割り算(ArithmeticException)
        //        System.out.println( 10 / 0);
                
                // nullの変数へアクセス(NullPointerException)
        //        System.out.println("strの文字列を表示" + str.length());
                
                // 配列の要素外へのアクセス(ArrayIndexOutOfBoundsException)
        //        int[] array = new int[10];
        //        System.out.println(array[20]);
                
                
            }
        
        }
      • RuntimeException?以外のException
        コンパイラによって前もってチェックされる例外です。
        チェックされる例外を発生するコードを書くときは、以下のいずれかを行わなければなりません。
        ・メソッド内のcatch節でその例外をキャッチする処理を書かく
        ・メソッドにthrowsでその例外を投げることを宣言する
  • エラー処理を実装するtry~catch~finally
    例外処理コードの書き方は、例外が起こりえる場所をtryブロックで囲み、catchブロックで例外(Exception)毎の処理を実装します。
    以下の3種類のブロックが例外に対する処理のブロックです。
    • tryブロック
      例外が起こりそうな場所を囲みます。
       
    • catchブロック
      • 例外が発生した際のエラーを処理するブロックです。例外(Exception)をキャッチ(catch)するためのブロックです。
         
      • catchブロックは複数記述することができます。
         
      • catchブロックは上から順にチェックされていきます。
        下の例でいうと、まずは「例外の種類1」であるかが判定されます。そうであれば、「例外に対する処理1」が実行されます。
        そうでなければ、「例外の種類2」がチェックされます。
         
    • finallyブロック
      例外が発生しようとも、しなかろうとも最終的に到達するブロックです。
      どんな場合でもかならず行いたい処理を記述しておきます。
    try {
    
        // 例外が起こりえる場所をtryブロックで囲みます
        // 例外をスローする可能性があります
        
    } catch (例外の種類1) {
    
        // 例外に対する処理1
        
    } catch (例外の種類2) {
    
        // 例外に対する処理2
        
    } finally {
    
        // かならず実行するブロック
        
    }
  • 例外処理のサンプルコード
    • 文字列から整数値に変換するときの例外処理を記述します。
      ファイル名:NumberTest?.java
      public class NumberTest {
      
          public static void main(String[] args) {
      
              try {
                  // 値を変更して例外が発生する場合としない場合の処理の流れを確認する
                  String str = "hogehoge";
      
                  // 文字列を整数値に変換するとき文字列が数値に変換できないものだったらにExceptionが発生します
                  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";
      
                  // 文字列を整数値に変換するとき文字列が数値に変換できないものだったらにExceptionが発生します
                  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を使用します。
    // throw 投げたい例外クラスのインスタンス(たとえば)
        if (flag) {
        
            // 正常時の処理を記述する
            
        } else {
        
            // エラー時の処理で例外を投げる
            throw new IOException();
        }
  • throws
    メソッド内で例外を発生させる可能性がある場合はthrowsを使用することができます。
    エラー処理はプログラムの深いところでは処理せずに、throwsで呼び出し元に投げるほうて上層部で処理をしたほうがよいでしょう。 以下の例は、throwSampleメソッドでIOExceptionが発生する可能性があることを示します。
        public void throwSample() throws IOException{
        
            // IOExceptionが発生する可能性のある処理を記述します。
            // (ファイルの読み込み処理)
            
        }
     
  • 独自の例外クラスを作成する
    業務などに応じて、独自の例外クラスを作成することができます。
    継承したいExceptionクラスを指定して、サブクラスとして独自の例外クラスを定義することができます。
    • 独自の例外クラスを作成し、使用するサンプルです。
      ファイル名:CustomException?.java
      public class CustomException extends Exception {
          
          public CustomException(String msg) {
              
              // スーパークラスのコンストラクタを呼び出し、詳細なメッセージを設定します。
              super(msg);
          }
      
      }
       
      独自の例外を発生するメソッドを作成する
      ファイル名:TestClass?.java
      public class TestClass {
      
          /**
           * 例外を投げる可能性のあるクラスです。
           * 判定処理に特に意味はないですので気にしないでください
           * 例外を投げる場合と、投げない場合で処理を分けたいのでif文で分けました。
           */
          public void throwSample(int n) throws CustomException{
              
              // 特に意味はないですけど、数値の判定を行う
              if (n > 50) {
                  // ここではOKだった場合の処理
                  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勉強会カリキュラムに戻る


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-13 (土) 10:20:33 (633d)