例外=実行時エラーのこと。
try{ FileWriter fw = new FileWriter("test.txt"); fw.write("abc"); fw.close(); } catch( IOException e ){ System.out.println("書き込みエラー:" + e.getMessage()); }
上の例はFileWriterクラスを使ってファイルに書き込む処理を行う。このとき、ファイルに書き込めないときなどに実行時エラー(例外)が発生する可能性がある。例外が発生したときのエラー処理を行う部分をcatchに書く。catchの()内には例外の種類(IOException)を書く。
例外が発生してもしなくても処理したいものをfinallyに書く。
try { int n = 8 / 0; } catch (ArithmeticException e) { System.out.println("エラー"); } finally { System.out.println("終了します"); }
try直後の()内にオブジェクト生成文を書くことで、正常時も例外発生時も自動的なcloseが出来る。
try (FileWriter fw = new FileWriter("test.txt") ){ fw.write("abc"); // fw.close(); 不要 } catch( IOException e ){ System.out.println("書き込みエラー:" + e.getMessage()); }
例外が発生する可能性があるにもかかわらず、try~catchをしない場合、メソッドの引数の横に「throws 例外名」と書いてこのメソッドでは例外処理をせず、呼び出し元で例外処理をすることを示す。
void test() throws IOException{ FileWriter fw = new FileWriter("test.txt"); fw.write("abc"); fw.close(); }
例外を発生させるには throw命令(throwsではない)
void test(num) { if( num == -1 ){ throw new ArithmeticException("エラー"); } ・・ }
例外発生の可能性がある場合、通常は例外処理は必ずしなくてはならないが、RuntimeExceptionとそれを継承した例外は例外処理(try~catchやthrows)をしなくてよい。
全てのクラスのスーパークラス
class Sample { public String toString(){ return "abc"; } } // 文字列化時 Sample s = new Sample(); System.out.println(s); // abcと表示
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("違う"); }
class Sample { int num=1; Sample(int num){ System.out.println(num); } Sample(){ this(10); // 上のコンストラクタが呼ばれ10と表示 } 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を書かないと近い方を表示) } }
class Sample2 extends Sample // 上のクラスを継承 { Sample2(){ super(10); // Sampleのコンストラクタが呼ばれ10と表示 } void func(){ super.func(); // Sampleのfuncが実行 } }
実行時に空白で区切って指定。mainメソッドの引数。
Eclipseでは、Javaファイルを右クリックし、[実行]-[実行の構成]で「引数」の「プログラムの引数」に1行1つで指定する。
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]); // いちご } }
通常の配列同様、lengthで何個入っているか分かる。これにより、コマンドラインで正しく指定されたかをチェックする。
※ファイル名を必ず1つ指定する例
java Sample test.txt
class Sample { public static void main(String[] args) { if( args.length != 1 ){ System.out.println("エラー"); return; } } }
// 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();
enum(列挙型)とは、定数の集合のこと。カテゴリやトランプのマークなどあらかじめ数が決まっている何パターンかを表したい場合に用いる。
enum 列挙型名 { 列挙子,列挙子,列挙子; } 例:商品を分類するコードを導入 enum Category { FRUITS,BOOK,DRINK; }
enum はその名前の型の変数があるかのように使う。値は 型名.列挙子 しか入れることは出来ない。
Category type; type = Category.FRUITS;
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が表示される。
Optional(列挙型)とは、オブジェクトが存在しない場合がありえる値を表す。nullを返す代わりに使用する。Spring Boot DATA JPAでは、データベースを主キーで検索するfindByIdを使用した場合の戻り値の型。
get() | オブジェクトを取得できる。存在しない場合、例外NoSuchElementException が起きる。 |
isPresent() | 存在する場合、true返す |
orElse(値) | 存在する場合、オブジェクトを取得。存在しない場合、値を返す |
orElseGet(()-> 式 ) | 存在する場合、オブジェクトを取得。存在しない場合、式の値を返す(存在しない場合しか式は評価されない) |
orElseThrow(()-> 例外) | 存在する場合、オブジェクトを取得。存在しない場合、例外を返す |
// 例外でエラー処理する例 try { Shouhin s = repository.findById(sid).get(); model.addAttribute("shouhin",s); }catch(NoSuchElementException e) { return "err"; }
// isPresentで判定する例 Optional<Shouhin> s = repository.findById(sid); if( s.isPresent()) { model.addAttribute("shouhin",s.get()); }else { return "err"; }
// orElseで存在しないときにnullを入れて判定する例 Shouhin s = repository.findById(sid).orElse(null); if( s == null) { return "err"; } model.addAttribute("shouhin",s.get());