2008年12月26日金曜日

例外の構成


  • 例外の種類
    Error: 重大例外(回復不能)
    Exception: catch必須、プログラムで回避不可能
    RuntimeException: catch必須ではない、プラグラムで回避可能

  • 呼び出し元で処理する例外があるメソッドでは、定義に throwsを付加
    この場合、メソッド内では該当例外のcatch処理不要
    ただし、スーパー例外クラスをcatchしている場合にはcatchしないとそちらで処理されてしまうので、catch→throwが必要。
    内部処理が伴う場合も、catch→内部処理→throw。

  • try,catch,finally節
    catch節は例外クラスごとに複数記述可能
    複数記述で重複一致時は先に記述されている節で処理する
    →上位クラスでのcatchを先に書くと到達不能catch節としてコンパイルエラーとなる
    finally節はひとつだけ、正常/異常時ともに実施する処理を記述(close処理など)
    finally節にreturn文があると異常時もreturnが実行される
    →戻り値のある関数では紛らわしい
    →基本としてfinally節にはreturn文を書かない

  • 「コンパイル時にチェックされない例外やエラー」を独自に実装する
    java.lang.RuntimeExceptionを継承するのが普通

  • 独自に例外を定義する方法
    Exceptionクラスを継承

    ※呼び出し元は例外処理の記述が強制される
    ※独自の例外クラスを変更した場合、呼び出し元の変更が必要となる場合もある

    独自の例外に置き換えてthrowする場合は

    1. 独自例外クラスにはthrowableを引数とするコンストラクタを定義

    2. 受け取った例外オブジェクトから独自例外クラスobjを作成してthrow



  • 例外を使うと処理の流れを変えることができる
    条件文のような使い方も可能だが、例外は「例外的な処理が発生したことを通知、捕捉する」という目的のもの
    →本来の目的で使用するべき

StringBuffer


  • クリア方法
    StringBuffer buf = "12345";

    //内容消去
    //deleteを使用
    buf.delete(0,buf.length());
    //setLengthを使用
    buf.setLength(0);

    buf.append(...)

  • reverseメソッド
    逆並びの文字列を取得
    【例】2進数表記文字列作成
      最下位桁から1bitずつ検査して0/1の文字列を作成し、reverseで逆点

2008年12月25日木曜日

Eclipse コード自動生成

  • 囲む-try、catchブロック
    適切な例外クラスでcatch節も作成
  • ソース-インポートの編成
    *を使用せずに個別指定のimport文を自動生成
    *使用分は個別指定に差し替え

2008年12月19日金曜日

リファクタリング

まとまった処理を別クラスの機能にする。
  1. メソッドの抽出
  2. 別クラス作成(空クラスでOK)
  3. メソッド移動
    →staticメソッドとなる
クラス名の変更
  • ファイル名も変更してくれるので簡単
  • 参照の更新をチェックすると(デフォルト)参照元も一括で変更できる

サブクラスインスタンスをスーパークラス型変数で参照

class SuperClass{
function1()
}
class SubClass extends SuperClass{
function1()//オーバーライド
}
SuperClass o = new SubClass();
0.function1();

この場合、function1はSubClassのインスタンスとして実行されるので、
SubClassで定義された処理となる。

実行時引数

起動構成で設定
  1. 対象class右クリック
  2. 実行-実行の構成
  3. 引数タブ、プログラムの引数で設定
ヒストリー実行は構成ごとに履歴を残すので、以前指定した引数をさかのぼって使用することは不可
引数を複数パターン準備するには構成を複数作成する必要あり

2008年12月18日木曜日

別クラスの利用

※同一プロジェクトのファイルで確認
  • 同一ファイル内
    クラス名のみで参照可能
  • 別ファイル同一パッケージ
    クラス内のみで参照可能
  • 別ファイル別パッケージ
    import追加で参照可能
    クラス名完全修飾で参照可能
下階層パッケージのクラス
 pkg1.class1 から pkg1.sub.class2を参照する
  • importの場合
    import pkg1.*;
    import pkg1.sub.*;
    import pkg1.sub.class2;

  • クラス名は完全修飾が必要
    相対指定では参照できない
    sub.class2ではだめ

コンストラクタ

  • 同じクラス内の別のコンストラクタ呼び出し
    this();
    this(引数);
  • スーパークラスコンストラクタ呼び出し
    super(); //省略時は暗黙で実行される
    super(引数);
  • superとthis
    スーパークラスコンストラクタと、同クラス別コンストラクタはコンストラクタ先頭に書く。
    両者の併用は不可。

2008年12月16日火曜日

多次元配列


  • 宣言
    int a[][] = new int[3][5];
    int a[][] = new int[3][];
    a[0]=new int[5];
    a[1]=new int[5];
    a[2]=new int[5];
  • 初期化
    int a[][] = {{1,2,3,4,5},{9,9,9},{1}}; ※非矩形でもOK
  • 文字列配列
    String aa[] = new String[3];
    String aa[] = { "str1","str2","str3"}; リテラル文字列で初期化

配列

  • 宣言
    int a[] = new int[10];
     int a[][];
     int a, b[];
     int func(int dt)[] 戻り値がint配列型

    int[] a = new int[10];
     int[][] a;
     int[] a,b[];
     a=(int[])b.clone();
     if( a instanceof int[]) int配列型の確認
     int[] func(int dt) 戻り値がint配列型

    int a[] = { 1,2,3,4,5 }; 初期値を与える場合new不要
  • 領域確保
    int a[]; 領域未設定 =null
    a = new int[10]; 領域確保、各要素は=0で初期化
  • 要素数
    lengthフィールドで取得(配列オブジェクトの変数?)
    int a[] = new int[10];
    n = a.length;
    ※メソッドではない

  • コピー
    個別:a[1] = b[2];
    参照:a=b; ※アドレスのコピー、実態は同じ
    複写:a=(int[])b.clone();
  • cloneによる複写
    a=(int[])b.clone();
    b配列と同じサイズの領域を確保し、先頭アドレスをaにセット
    ※コピー先の事前領域確保は不要
    ※多次元配列はそれぞれ処理が必要
    int aa[][];
    int bb[][];
    for(int i=0; i<aa.length; i++)
    bb[i] = (int[])aa[i].clone();
  • arraycopyによる複写
    System.arraycopy(from,0,to,0,from.length);
    ※各要素をコピーするので、コピー先は事前に領域確保が必要

2008年12月9日火曜日

文字コード、改行コード設定

  • ソースの文字コード
    全体のほかにファイル単位での設定が可能
    デフォルトはファイルの種類によって違う
    HTML:charsetから検出(実際のコードではなく)
    java,php:全体の設定にしたがう(実際のコードではなく)
    →普通のエディタだとファイル単位で自動認識なのでかなり不便
  • 文字コード
    設定→一般→ワークスペース
    ※プロジェクト単位:プロパティ→リソース
  • 改行コード
    Unix
    設定→一般→ワークスペース
    ※プロジェクト単位:プロパティ→リソース

検索方法

  • ファイル検索:通常の検索
  • java検索:宣言、参照等文脈に対応した検索
  • その他
    ファイル内での出現箇所、読み込み、書き込みアクセス箇所
    エディタでは選択している識別しの出現箇所が自動でハイライトされる。

ライブラリ参照設定

  • javax.servletの参照
    ビルドパス構成で、eclipse/plugin下のjaraを外部jarファイルの参照として追

第2章 変数と定数

  • 基本データ型
    char  16ビット Unicode文字(\u0000~\uFFFF)
    byte、short、int、long  8~64ビット符号付整数
    float、double 32、64ビット浮動小数点数
    ※整数系はすべて符号付(charは符号無し)
  • 変数初期化
    クラスフィールドと配列変数は自動で初期化される。
    メソッド内変数は明示的に初期化必要
  • 論理型(boolean) 
    true/false
    ※数値の0はfalseとなみなさない
    =0はエラー
    while(1) も不可 → while(true)
    if( <整数型変数> ) 不可 → if( <整数型変数> != 0 )
  • char
    文字コードはUnicode(\u0000)
    16進表記(0x0000)でも、10進表記でもOK
  • 整数型
    範囲を超える数値を代入するとエラー
    →キャストすればOK,ただしキャスト先のコードで解釈した値となる
    数値をそのまま書くとint
    long値の場合はサフィックス(L or l)を付加する
    long lval = 123456789012345L;
  • 浮動小数点数型
    数値そのままでdouble
    基本はdoubleを使用
    F or f のサフィックスでfloat
  • 文字列
    Stringクラスを使用
    連結は + で str = "123" + "456";
    比較はequalsメソッドで (==は別の意味、アドレス比較)
    大小比較はcompareToメソッド(< は不可)
  • 列挙型(enum)
    java.lang.Enumクラス
    J2SE5.0から使用可能
    finalを並べるより便利
     enum Marks { CLUB, SPADE, HEART, DIAMOND }
       :
      Marks Card;
      case marks.SPADE:
     ↑switch文にも使用可能
    compareTo、equals等で比較
    toString、name等で内容表示
    変数名のみでtoStringの省略形(System.out.println(Card);で "SPADE"出力)
  • 任意桁の数値
    BigInteger: 任意精度の整数
    BIgDecimal: 任意精度の固定小数点数
  • 文字リテラル
    シングルクォートで囲む
    System.out.println((int)'亜'); 文字コード出力
  • エスケープ文字
    \nnn :8進数で示す文字
    \unnnn: 16進数で示す文字
  • 文字列リテラル
    ダブルクォートで囲む
  • 改行コード
     \n : 0A
    printlnの改行: システム依存 0D0Aや0A
    printfの%n: 同上
  • nullリテラル
    参照型変数が有効なオブジェクトをさしていないことをあらわす
    String ss = null;
    readLine(); などは入力終了でnullを返す。
    →状態検出に使用する
    while( ( ss = fin.readLine() ) != null ) 
    ※while( ss = fin.readLine() ) ではない!! 
  • final
    final int MAX_XXX = 100; ←メソッド内定数
    static final int MAX_XXX =1000; ←クラス定数

基礎知識

  • 修飾子
    abstruct: クラス、メソッド
    final: クラス、メソッド 継承不可、オーバーライド不可
         フィールド、変数 値変更不可
    native: メソッド Cなどのプラットフォーム依存の言語で実装
    private
    protected: フィールド、メソッド 同一パッケージと継承クラスからアクセス可
    public
    static: フィールド クラス変数
        メソッド クラスメソッド
    synchronized: スレッドセーフ ロック処理をする
  • JARファイル
    zip形式で圧縮
    jarコマンドで作成、tarと同じようなオプション
     >jar cvf xxx.jar ./*.class