ICT関連の学習備忘録

ICTの学習をアウトプットするワークブックサイト

ICT関連の学習備忘録

2019/09/30:例外と入出力処理

例外の基本(try~catch)

Javaではプログラム実行時のエラーを適切に処理するため、例外(exception)
という仕組みを備えており、例外が起きたということを、
例外が送出された(throw)と呼んだりします。
構文
try{
   例外の発生を調べる文;
   ・・・
}
catch(例外のクラス 変数名){
   例外が起きた時の処理する文;
   ・・・
}
上記二つのブロックを付けると、次のような順番で例外が処理される
1.tryブロックの中で例外が起きると、そこで処理を中断する。
2.例外がcatchブロックの()内の例外の種類としていれば、
  そのcatchブロック内の処理を行う
3.catchブロックが終わったら、そのtry~catchブロックのあとから
  処理が続けられる。
catchブロックの()内の種類が一致し、catchブロックの処理が行われる事を
catchブロックで例外を受け取る(catch)という。
class Sample2
{
   public static void main(String[] args)
   {
   	try{
      int[] test;
      test = new int[5];

      System.out.println("test[10]に値を代入します。");

      test[10] = 80;
      System.out.println("test[10]に80を代入しました。");
      System.out.println("無事終了しました。");
   	}catch(java.lang.ArrayIndexOutOfBoundsException e){
   		System.out.println("エラーが検出されました。\nエラー内容:" + e);
   	}
   }
}


#実行結果
C:\YJSample\14>java Sample2
test[10]に値を代入します。
エラーが検出されました。
エラー内容:java.lang.ArrayIndexOutOfBoundsException: 10

finallyブロック

finallyブロックは、例外発生の有無にかかわらず
そのメソッド内で最後に必ず行われるブロックで、
例えメソッド内に一致するcatchブロックが無かったとしても
finallyブロックだけは最後に必ず処理されます。
try~catch~finallyは例外処理の基本となっています。
class Sample3
{
   public static void main(String[] args)
   {
   	try{
      int[] test;
      test = new int[5];

      System.out.println("test[10]に値を代入します。");

      test[10] = 80;
      System.out.println("test[10]に80を代入しました。");
      System.out.println("無事終了しました。");
   	//}catch(java.lang.ArrayIndexOutOfBoundsException e){
   	//	System.out.println("エラーが検出されました。\nエラー内容:" + e);
   	}finally{
   		System.out.println("「finally処理は最後に必ず実行される」");
   	}
   }
}

#実行結果
C:\YJSample\14>java Sample3
test[10]に値を代入します。
「finally処理は最後に必ず実行される」
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
        at Sample3.main(Sample3.java:11)

例外クラスを宣言・例外を送出する

例外を起こすコード、すなわち、自分で例外クラスを作る事が出来ます。
自分で例外クラスを作るには、Throwableクラスのサブクラスを拡張して
例外クラスを宣言することが必要です。
例えば、Exceptionクラス(Throwableクラスのサブクラス)から、
CarExceptionクラスと言う独自の例外クラスを拡張すると
「class CarException extends Exception」
とextendsでExceptionを拡張する事になります。

例外を送出する
例外を送出するにはthrowという文を使います。
構文:例外の送出
throw 例外のオブジェクトを指す変数;
さらに、メソッドの後ろにはthrowsというキーワードをつけ、
そのメソッドが例が例外を送出する場合がある事を示します。
構文:例外を送出するメソッド
戻り値の型 メソッド名(引数リスト) throws 例外クラス
//独自の例外クラスを宣言する。
class CarException extends Exception
{
}

//車クラス
class Car
{
	private int num;
	private double gas;
	
	public Car()
	{
		num = 0;
		gas = 0.0;
		System.out.println("車を作成しました。");
	}
	public void setCar ( int n , double g) throws CarException
	//「throws」で例外を送出する可能性があるメソッドであることを宣言する。
	{
		if(g < 0){
			//例外のオブジェクトを作成する。
			CarException e = new CarException();
			//作成したオブジェクトを送出する。
			throw e;
		}else{
			num = n;
			gas =g;
			System.out.println("ナンバーを" + num + "にガソリン量を"
				+ gas + "にしました。");
		}
	}
	public void show()
	{
		System.out.println("車のナンバーは" + num + "です。");
		System.out.println("ガソリン量は" + gas + "です。");
	}
}

class Sample5
{
	public static void main(String[] args)
	{
		Car car1 = new Car();
		try{
			car1.setCar(1234, -10.1);	//この呼び出しで例外が送出される。
		}catch(CarException e){
			System.out.println(e + "が送出されました。");
		}
		car1.show();
	}
}

#実行結果
C:\YJSample\14>java Sample5
車を作成しました。
CarExceptionが送出されました。
車のナンバーは0です。
ガソリン量は0.0です。

入出力(ストリーム)

画面に出力したりキーボードから情報を入力するなど様々な装置に
対する入出力機能を支える概念を、ストリーム(stream)と言い、
ストリームは、様々な異なる装置を同じように扱う為の抽象的な仕組みです。
キーボードからの入力を画面に出力する流れを表すと
1.System.in(標準入力)からInputStreamReaderクラスのオブジェクトを作成する。
2.1からBufferedReaderクラスのオブジェクトを作成する。
3.2のreadLine()メソッドを使って1行データを読み込む。
※System.out・・・標準出力
 System.oin・・・標準入力
InputStreamReaderクラス(文字ストリーム)は文字や文字列を読み書きするストリームで
これにバッファと呼ばれる場所を介してデータを読み書きするBufferedReaderクラスを
加えて使うと、読み書きの効率が良くなります。

ファイルに出力(BufferdWriter)


ファイルの入出力の場合には、
ファイルへの書き出しの事を出力
ファイルからの読み込みの事を入力
といいます。
ファイルへ文字列を書き出す為には、下記のような手順をとっている。
1.ファイル名を指定してFileWriterクラスのオブジェクトを作成する。
2.1からBufferedWriterクラスのオブジェクトを作成する。
3.2からPrintWriterクラスのオブジェクトを作成する。
4.3のprintln()メソッドを使って1行データを書き出す。
5.処理終了後にclose()メソッドを使いファイルをクローズする。
※FileWriterクラス・・・ファイルに書き込むための文字ストリーム
 BufferedWriterクラス・・・バッファを介して書き込むための文字ストリーム
 PrintWriterクラス・・・1行書き出すための文字ストリーム
import java.io.*;

class Sample7{
	public static void main(String[] args){
		try{
			//1行書き出す準備をする。
			PrintWriter pw = new PrintWriter
			(new BufferedWriter(new FileWriter("test1.txt")));
			//ファイル名を指定してファイルに書きだすための文字ストリームを作成。
			//バッファを介して書き込むようにする。
			
			//1行ずつ書き込みをする。
			pw.println("Hello!");
			pw.println("GoodBye!");
			System.out.println("ファイルに書き込みました。");
			
			pw.close();	//ファイルをクローズする。
			
		}
		catch(IOException e){
			System.out.println("入出力エラーです。");
		}
	}
}

#実行結果
C:\YJSample\14>java Sample7
ファイルに書き込みました。

#C:\\YJSample\14\test1.txt
Hello!
GoodBye!

ファイルに入力(BufferdReader)

1.ファイル名を指定してFileReaderクラスのオブジェクトを作成する。
2.1からBufferedReaderクラスのオブジェクトを作成する。
3.2のreadLine()メソッドを使って1行データを読み込む
※FileReaderクラス・・・ファイルを読み込むための文字ストリーム
 BufferedReaderクラス・・・バッファを介して読み込むための文字ストリーム
import java.io.*;

class Sample8{
	public static void main(String[] args){
		try{
			BufferedReader br =
			new BufferedReader(new FileReader("test1.txt"));
			//バッファを介して読み込むようにする。
			//ファイル名を指定して、ファイルから読み込む為の文字ストリームを作成する。
			
			//1行ずつ読み込む
			String str1 = br.readLine();
			String str2 = br.readLine();
			
			System.out.println("ファイルに書き込まれている2つの文字列は");
			System.out.println(str1 + "です。\n" + str2 + "です。");
			
			br.close();	//ファイルをクローズする。
			
		}
		catch(IOException e){
			System.out.println("入出力エラーです。");
		}
	}
}

#実行結果
C:\YJSample\14>java Sample8
ファイルに書き込まれている2つの文字列は
Hello!です。
GoodBye!です。

コマンドライン引数を使う

コマンドライン引数とは、ユーザが実行時に入力する値を受け取って、
プログラムの処理に利用する機能です。
次のようにmain()メソッドの引数として定義されています。
構文:コマンドライン引数
public static void main(String[] args)
{
・・・
}
プログラム実行時に引数は記述した順にargs[*]へ渡されます。
>java Sample10 test.txt Hello GoodBye
上記の場合だと、
test.txt・・・args[0]に渡される。
Hello・・・args[1]に渡される。
GoodBye・・・args[2]に渡される。
#C:\YJSample\14\Sample10.java
import java.io.*;

class Sample10{
	public static void main(String[] args)
	{	
		//入力した文字列の個数を調べる。
		if(args.length != 1){
			System.out.println("ファイル名を正しく指定してください。");
			System.exit(1);
		}
		try{
			BufferedReader br =
			new BufferedReader(new FileReader(args[0]));
			//入力した1番目の文字列(ファイル名↑)から、
			//文字ストリームを作成する。
			
			String str;
			
			while((str = br.readLine()) != null){
				System.out.println(str);
			}
			br.close();
		}catch(IOException e){
			System.out.println("入出力エラーです。");
		}
	}
}

#C:\YJSample\14\test3.txt
A long time ago,
There was little girl.

End

#実行結果
C:\YJSample\14>java Sample10 test3.txt
A long time ago,
There was little girl.

End



前のページへ戻る