例外処理とファイル入出力

例外処理 と
ファイル入出力
情報システム学科
平塚 聖敏
例外処理とは
プログラムの実行中に発生した問題を通知す
るために、実行時に生成される
オブジェクト
 例外の例

 スタックオーバーフロー、メモリ不足
 配列の要素数を超えて参照しようとしたりする
例外処理の手順 その1
基本の例外処理
tryブロックで処理を囲む

1.
try{
//処理
}
catchブロックで例外を捕捉
2.
catch (例外オブジェクト パラメータ) {
//処理
}
finallyブロックで後処理
3.
finally {
//処理
}
例外処理の手順 その1の中身
1.
2.
3.
4.
5.
tryブロックで例外が起こった場合
ブロック内の残りの処理をスキップ
catchブロックの例外を探索
見つかれば、その処理を行う
無ければfinallyブロックに進む
tryブロックには・・・
tryブロックを書いたら、必ずcatchブロックま
たは、finallyブロックを書かなければならない。
 catchブロックの後に、finallyブロックを書かな
くても、デフォルトのfinallyブロックが生成され、
実行される。

例外オブジェクト

例外に指定できるオブジェクトは、Throwable
でなければならない

Throwableは、すべての例外クラスのスー
パークラス
Errorクラス、Exceptionクラス

Errorクラス
 通常のアプリケーションであればキャッチすべき
でない重大な問題を指す

Exceptionクラス
 通常のアプリケーションでキャッチされる可能性
のある状態を指す
例外処理の例 前半
class Divider {
public static void main( String args[] ) {
try {
System.out.println("Before Division");
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
System.out.println(i/j);
System.out.println("After Division");
}
例外処理の例 後半
catch (ArithmeticException e) {
Sytem.out.println("ArithmeticException");
}
catch (ArrayIndexOutOfBoundsException e) {
System.out.pritln
("ArrayIndexOutOfBoundsException");
}
catch (NumberFormatException e) {
System.out.println("NumberFormatException");
}
finally {
System.out.println("finally brock");
}
}
}
例外処理の例2 前半
class ClassCast {
public static void main(String args[]) {
try {
Object obj = new Integer("85");
Double dobj = (Double)obj;
//ここでjava.lang.ClassCastException:
//java.lang.Integerの例外発生!!
System.out.println("After cast");
}
catch (Exception e) {
System.out.println(e);
}
}
}
Exception
catchブロックの最初の例外でException
 これは全ての例外クラスに該当
 従って、そのほかの例外を捕捉できない

Throwステートメント

新しいオブジェクトを作成して投げる
throw new ExceptionType(args);

ExceptionTypeは例外オブジェクトの型

argsはコンストラクタの引数リストで省略可能
Throwステートメントの例
class ThrowDemo2 {
public static void main(String args[]) {
try {
System.out.println("before a");
a();
System.out.println("after a");
}
catch (Exception e){
System.out.println("main : " + e);
}
finally {
System.out.println("main : finally ");
}
}
前半
Throwステートメントの例
後半
public static void a() {
try {
System.out.println("before throw statement");
throw new ArithmeticException();
}
catch (Exception e) {
System.out.println("a : " + e);
}
finally {
System.out.println("a : finally");
}
}
}
Throwsステートメント
書く理由・利点
 呼び出し元に対して例外を投げる可能性があるメ
ソッドを書いた場合
 どの例外が投げられるのかを明示しておくと便利
 それらの例外に対処することができる

ほかのプログラマが書いたコード
 どの例外が投げられるか分かる

このJava言語の機能を利用すれば、エラーの起こり
にくいプログラムを作成できる
throwsの例 前半
public class ThrowsDemo {
public static void main(String[] args) {
try {
getRatio(args);
}
catch(Exception e){
System.out.println(e);
}
finally{
System.out.println("main : finally");
}
}
throwsの例 後半 その1
public static void getRatio(String str[])
throws ArithmeticException,
ArrayIndexOutOfBoundsException,
NumberFormatException{
try{
double r = Double.parseDouble(str[0]);
double f = Double.parseDouble(str[1]);
if ( f==0.0) {
throw new ArithmeticException();
}
System.out.println("比は" + r/f + " です");
}
throwsの例 後半 その2
catch(ArithmeticException e){
System.out.println("getRatio : ArithmeticException" + e);
throw new ArithmeticException();
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("getRatio : " + e);
throw new ArrayIndexOutOfBoundsException();
}
catch(NumberFormatException e){
System.out.println("getRatio :" + e);
throw new NumberFormatException();
}
finally {
System.out.println("getRatio : finally");
}
}
}
ファイル入出力

ファイルとディレクトリ
 Fileクラスは、ファイルとディレクトリのプロパティ
に関する情報をカプセル化したクラス
 プロパティには、読み取り、書き込み、前回の修
正時刻、長さが含まれる。
 ディレクトリに収めるファイルを指定できる。
 新しいディレクトリを作成したり、既存のファイル、
ディレクトリを削除、名前変更ができる。
Fileコンストラクタ

File(String path)
 ファイルまたはディレクトリのパスを指定

File(String directoryPath, Stringn filename)
 ディレクトリパスとディレクトリ内のファイル名

File(File directory, String filename)
 ディレクトリのファイルオブジェクトとディレクトリ内のファイ
ル名

pathまたはfilenameがnullの場合、
NullPointerExceptionを投げる。
Fileクラスの例
import java.io.*;
public class FileDemo {
public static void main(String[] args) {
try {
System.out.println("pathSeparatorChar = "
+File.pathSeparatorChar);
System.out.println("separatorChar = " +File.separatorChar);
File file = new File(args[0]);
System.out.println("getName()= " +file.getName());
System.out.println("getParent() = " +file.getParent());
System.out.println("getAbsolutePath() = " +
file.getAbsolutePath());
System.out.println("canRead() = " +file.canRead());
}
catch (Exception e){
e.printStackTrace();
}
}
}
ストリーム

ストリームとは、
 データのソースまたはデスティネーションの抽象的な概念

ストリームにより、同じテクニックで各種の物理デバ
イスに接続できる

1つの入力ストリームで、キーボード、ファイル、メモ
リバッファなど異なるデバイスからそのデータを読み
取ることができる。
また出力ストリームで、モニタ、ファイル、メモリバッ
ファと異なったデバイスにデータを書き込める。

文字ストリーム
文字ストリームとバイトストリームの2タイプ
 バイトストリーム

 バイナリデータの読み書き

文字ストリーム
 文字および文字列の読み書き
入力文字ストリーム : バイトを文字に変換
 出力ストリーム :
文字をバイトに変換する
 Javaは、内部で文字を16ビットのUnicodeで表す

クラスの階層
Object--+---Reader--+----BufferedReader
|
|
|
+----InputStreamReader|
---FileReader
|
+------Writer--+----BufferedWriter
|
+---OutputStreamWriter----FileWriter
|
+---PrintWriter
Writerクラス
Writeオブジェクトに基づいて同期化を行う
抽象クラス
 OutputStreamWriterクラス

 Writerクラスを拡張したクラス

FileWriterクラス
 OutputStreamWriterクラスを拡張したクラス
Witerクラスのメソッド
全てのメソッドがIOExceptionを投げる。
 abstract void close() throws IOException
 abstract void flush() throws IOException
 void write(int c) throws IOException
 void write(char buffer[]) throws IOException
 abstract void write(char buffer[], int index, int
size) throws IOException
 void write(String s) throws IOException
 void write(String s, index, int size)
throws IOException

Readerクラス
全ての文字入力ストリームに利用できる機能
が定義されている抽象クラス。
 InputStreamReaderクラス

 Readerクラスを拡張したクラス

FileReader
 InputStreamReaderクラスを拡張したクラス
ファイルに文字を書き込む例
import java.io.*;
public class FileWriterDemo {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter(args[0]);
for(int i = 0; i<12; i++){
fw.write("Line " + i + "\n");
}
fw.close();
}
catch (Exception e){
System.out.println("Exception : "+ e);
}
}
}
ファイルに文字を読み込む例
import java.io.*;
public class FileReaderDemo {
public static void main(String[] args) {
try {
FileReader fr = new FileReader(args[0]);
int i;
while( (i=fr.read()) != -1){
System.out.print((char)i);
}
fr.close();
}
catch(Exception e){
System.out.println("Exception :" + e);
}
}
}
バッファ付き文字ストリーム

バッファ付き文字ストリームを用いると、物理
デバイスへの読み書きの回数が減らせる

クラス
 BufferedWriter
 BufferedReader
BufferedWriter
Witerクラスの全てのメソッドを実装
 改行文字の出力するメソッド

 newLine()
throws IOException
BufferedReader
Readerクラスの全てのメソッドを実装
 改行文字までを読み込むメソッド

 readLine()
throws IOException
BufferedWriterの例
import java.io.*;
public class BufferedWriterDemo {
public static void main(String[] args) {
try {
FileWriter fw = new FileWriter(args[0]);
BufferedWriter bw = new BufferedWriter(fw);
for(int i = 0; i<12; i++){
bw.write("Line "+ i + "\n");
}
bw.close();
}
catch(Exception e){
System.out.println("Exception" + e);
}
}
}
BufferedReaderの例
import java.io.*;
public class BufferedReaderDemo {
public static void main(String[] args) {
try {
FileReader fr = new FileReader(args[0]);
BufferedReader br = new BufferedReader(fr);
String s;
while( (s=br.readLine()) != null){
System.out.println(s);
}
fr.close();
}
catch(Exception e){
System.out.println("Exception :" + e);
}
}
}
標準入力
import java.io.*;
//無限ループ のプログラム
public class ReadConsole {
public static void main(String[] args) {
try {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s;
while( (s=br.readLine()) != null) {
System.out.println(s.length());
}
isr.close();
}
catch(Exception e){
System.out.println("Exception : " + e);
}
}
}
PrintWriterクラス

Writerクラスを拡張したクラス

int, float, charなどの基本データ型およびオ
ブジェクトと等価な文字列を表示する
PrintWriterクラスの例
import java.io.*;
public class PrintWriterDemo {
public static void main(String[] args) {
try {
PrintWriter pw = new PrintWriter("abc.txt");
pw.println(true);
pw.println('A');
pw.println(23.45);
pw.println("Hello");
pw.close();
}
catch(Exception e){
System.out.println("Exception : " + e);
}
}
}
例外処理の問題



ユーザーがキーボードからデータを入力し、入力さ
れたデータの平均値を求めるプログラムを作成した
い。
用意するデータはdouble型で、配列要素数は5個。
捕捉する例外はつぎの3つとする
入力データなしのとき
 IndexOutOfBoundsException データ数が合わないとき
 NumberFormatException 入力データが不正なとき
 ArithmeticException
入出力






ユーザーが999の数を入力するまで、入力を求め、
ファイルに入力されたデータを書き込むプログラム
を作成したい。
書き込むファイル名を指定する
データ入力を求める。
999でなければ、さらに入力を求める。
入力が終わったらデータをファイルに出力する。
不正な入力の時は、例外処理をする