例外
例外=エラーのこと。
try{ FileWriter fw = new FileWriter("test.txt"); fw.write("abc"); fw.close(); } catch( IOException e ){ System.out.println("書き込みエラー"); }
上の例はFileWriterクラスを使ってファイルに書き込む処理を行う。このとき、ファイルに書き込めないときなどにエラー(例外)が発生する可能性がある。例外が発生したときのエラー処理を行う部分をcatchに書く。catchの()内には例外の種類(IOException)を書く。
finally
例外が発生してもしなくても処理したいものをfinallyに書く。
try{ FileWriter fw = new FileWriter("test.txt"); fw.write("abc"); fw.close(); } catch( IOException e ){ System.out.println("書き込みエラー"); }finally{ System.out.println("終了"); }
自動的なclose
try直後の()内にオブジェクト生成文を書くことで、正常時も例外発生時も自動的なcloseが出来る。
try (FileWriter fw = new FileWriter("test.txt") ){ fw.write("abc"); // fw.close(); 不要 } catch( IOException e ){ System.out.println("書き込みエラー"); }
try~catchしない場合
例外が発生する可能性があるにもかかわらず、try~catchをしない場合、メソッドの引数の横に「throws 例外名」と書いてこのメソッドでその例外が発生することを示す。
void test() throws IOException{ FileWriter fw = new FileWriter("test.txt"); fw.write("abc"); fw.close(); }
例外処理しなくても良い例外
RuntimeExceptionを継承した例外は例外が発生する可能性があっても例外処理(try~catchやthrows)をしなくてよい。以下のような例外である。
- ArithmeticException 数学的なエラー(整数の0による除算など)
- ArrayIndexOutOfBoundsException 配列の範囲外の添え字
- NullPointerException オブジェクトにアクセスしたが中身が入っていない
- NumberFormatException 文字列の数値への変換に失敗(Integer.parseIntなど)
例外を発生させる
例外を発生させるには throw命令(throwsではない)
void test(num) { if( num == -1 ){ throw new ArithmeticException("エラー"); } ・・ }
final
- final クラス・・継承できない
- final メソッド・・オーバーライドできない
- final 変数・・変更できない(定数)
スレッド
- スレッドは Thread クラスを継承するか Runnable インタフェースを実装する。
- スレッドを開始するには start
- スレッドの処理内容は run メソッドに書く。
- スレッドを一時停止するには sleep
- スレッドの強制停止は stop(非推奨)
- スレッドの同期は synchronized を指定する。メソッド・ブロックどちらにも指定可能。(synchronizedの例)
// Threadクラス継承例 class Sample extneds Thread { private String name; public void run() { for(int i=0;i < 5;++i){ System.out.println("処理中"); } } } // 上のクラスのスレッドを開始 Sample s = new Sample(); s.start();
// Runnable インタフェース実装例 class Sample implements Runnable { private String name; public void run() { for(int i=0;i < 5;++i){ System.out.println("処理中"); } } } // 上のクラスのスレッドを開始 Sample s = new Sample(); Thread th1 = new Thread(s); th1.start();
Objectクラス
全てのクラスのスーパークラス
主なメソッド
- toString 文字列化するときに呼ばれる
- equals 比較するときに呼ばれる
toStringの例
class Sample { public String toString(){ return "abc"; } } // 文字列化時 Sample s = new Sample(); System.out.println(s); // abcと表示
文字列の比較(equals)
String str1 = "abc"; String str2 = System.console().readLine(); // abcと入力してみる if( str1 == str2 ){ System.out.println("同じ"); }else{ System.out.println("違う"); // 違うと表示される } if( str1.equals(str2) ){ System.out.println("同じ"); // 同じと表示される }else{ System.out.println("違う"); }
thisとsuper
- this:自クラスのオブジェクトを示す。
- this():自クラスのコンストラクタを示す。
class Sample { int num=1; Sample(){ System.out.println("abc"); this(10); // 下のコンストラクタが呼ばれ10と表示 } Sample(int num){ System.out.println(num); } void func(){ System.out.println(this.num); // 1と表示 System.out.println(num); // 1と表示(thisは省略できる) int num = 2; // 別のnumを作成 System.out.println(this.num); // 1と表示 System.out.println(num); // 2と表示(thisを書かないと近い方を表示) } }
- super:スーパークラスを示す。
- super():スーパークラスのコンストラクタを示す。
class Sample2 extends Sample // 上のクラスを継承 { Sample2(){ super(10); // Sampleのコンストラクタが呼ばれ10と表示 } void func(){ super.func(); // Sampleのfuncが実行 } }
コマンドライン引数
実行時に空白で区切って指定。mainメソッドの引数。
実行の例
java Sample りんご いちご みかん
class Sample { public static void main(String[] args) { System.out.println(args[0]); // りんご System.out.println(args[1]); // みかん System.out.println(args[2]); // いちご } }
args.length
通常の配列同様、lengthで何個入っているか分かる。これにより、コマンドラインで正しく指定されたかをチェックする。
※ファイル名を必ず1つ指定する例
java Sample test.txt
class Sample { public static void main(String[] args) { if( args.length != 1 ){ System.out.println("エラー"); return; } } }
enum
enum(列挙型)とは、定数の集合のこと。カテゴリやトランプのマークなどあらかじめ数が決まっている何パターンかを表したい場合に用いる。
構文
enum 列挙型名 { 列挙子,列挙子,列挙子; } 例:商品を分類するコードを導入 enum Category { FRUITS,BOOK,DRINK; }
enum の使用
enum はその名前の型の変数があるかのように使う。値は 型名.列挙子 しか入れることは出来ない。
Category type; type = Category.FRUITS;
enum の判定
if( type == Category.FRUITS){ System.out.println("果物です"); } //ただしswitch 文では型名を書かなくて良い。 switch( type ){ case FRUITS: System.out.println("果物です"); break; case BOOK: System.out.println("本です"); break; case DRINK: System.out.println("飲み物です"); break; }
画面に表示(文字列化)
そのまま画面に表示すると列挙子が表示される。
System.out.println(type); // FRUITS と表示
この表示を変えるにはenum 内でtoString を作る。このときname()で列挙子を文字列で参照できる。
enum Category { FRUITS,BOOK,DRINK; public String toString(){ return "種類:" + name(); } }
値の割り当て
各列挙子に値を割り当てることが出来る。このとき、値はそのenum のコンストラクタで受け取る。
enum Category { FRUITS(1),BOOK(2),DRINK(3); private int num; private Category(int n){ num = n; } public int getNum(){ return num; } } 例: Category type; type = Category.FRUITS; System.out.println(type.getNum()); //1が表示される。