Java開発 虎の巻

Java応用

例外

例外=エラーのこと。

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が表示される。