Java応用

static 追加資料 ラムダ式

例外

例外=実行時エラーのこと。

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

例外が発生してもしなくても処理したいものをfinallyに書く。

try {
	int n = 8 / 0;
} catch (ArithmeticException 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("書き込みエラー:" + e.getMessage());
}

try~catchしない場合

例外が発生する可能性があるにもかかわらず、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)をしなくてよい。

よく使う例外

例外のクラス

final

Objectクラス

全てのクラスのスーパークラス

主なメソッド

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

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]);	//	いちご
	}
}

args.length

通常の配列同様、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 列挙型名 {
	列挙子,列挙子,列挙子;
}
例:商品を分類するコードを導入
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が表示される。

Optional

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());