分類:[Java]
2010/09/24(Fri) 15:48:22 編集(投稿者)
2010/09/24(Fri) 15:47:46 編集(投稿者)
普段は.NET(VB,C#)で開発をしています。
Javaの初歩的な基礎知識はありますが、業務でJavaを使用したことはありません。
今回Java(Android)で作業しているのですが、件名について質問いたします。
件名の通り、Javaの検査例外の処理が面倒です。
たとえばファイルをコピーする処理の場合、finallyのbr.close(),bw.close()でも検査例外が出るのでtry〜catchで囲まないとコンパイルエラーになります。
private void fileCopy(InputStream is , String filename ){
BufferedReader br = null;
OutputStream os = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new InputStreamReader(is));
os = openFileOutput(filename, MODE_PRIVATE);
bw = new BufferedWriter(new OutputStreamWriter(os));
String str;
while((str = br.readLine()) != null){
bw.append(str +"\n");
}
bw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
fileCopyメソッドを呼び出す側では、ファイルの存在チェックを行ってからこのメソッドを呼び出しているので
FilNotFoundExceptionがもし発生しても何もしないですし、IOExceptionが発生しても何もできないです。
(.Netでは例外を出すコストもあるので、事前に検査できるものは検査しましょうって言われていたと思います。
なのでファイルの存在チェックは必ず行っています。その上で発生するFileNotFoundExceptionはキャッチしていません。)
.NETでは処理できる例外のみをキャッチして処理し、それ以外はApplication.ThreadExceptionで処理しています。
Javaでも検査例外を実行時例外でラップし再スローして、UncaughtExceptionHandlerで処理しようと思っています。
質問1
finallyをスッキリ書きたいのですが、以下のようなtry〜catchを2重にするサンプルがありました。
このような書き方は一般的ではないのでしょうか?
(あまりみたことがないけれど、他にスッキリ書ける方法がわかりません)
private void fileCopy(InputStream is , String filename ){
BufferedReader br = null;
OutputStream os = null;
BufferedWriter bw = null;
try {
try {
br = new BufferedReader(new InputStreamReader(is));
os = openFileOutput(filename, MODE_PRIVATE);
bw = new BufferedWriter(new OutputStreamWriter(os));
String str;
while((str = br.readLine()) != null){
bw.append(str +"\n");
}
bw.flush();
} finally {
br.close();
bw.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
質問2
実行時例外でラップし再スローするにあたって、以下のようなラップ例外を一つ一つ書かなければいけないのでしょうか?
その際のパッケージはどうするのがいいでしょうか?Exceptionパッケージに全部つめこんでも問題ないでしょうか?
FileNotFoundRuntimeException
IORuntimeException
質問3
Javaと.Netでは例外の取り扱いが違うのは理解しているつもりですが
.Netに合わせたようなこのような方法はおかしいですか?