みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Javaの例外処理の書き方について

Javaの例外はErrorとRuntimeExceptionは書かなくてもいいが、
Exceptionはtryでcatchする必要があると聞きました。

しかし、java.langのStringを使っても例外処理は書きません。
なぜ、例外を書くやつと書かないやつがあるのですか?

たとえば、java.langを使うとしたら、

ClassNotFoundException
CloneNotSupportedException
Exception

の3つをjava.langを使うメソッドのブロックの上にtry文が必要だと思うのですが。

投稿日時 - 2009-03-04 15:23:10

QNo.4767675

暇なときに回答ください

質問者が選んだベストアンサー

> 現場の知恵みたいなものはどうやって身に付けていくのですか?
経験ね。

じゃなくて
自分で実装したコードを
他の人に見てもらうことね。
10人いれば10人のポリシーがあり
それぞれいろいろな情報を持っているわ。

頭つき合わせて
もっと改善できないかとか話し合うのもいいわ。

あと他人の実装したコードを見るのも勉強になるわ。
例えばJavaなんかオープンソースが多いから
結構役に立つわよ。
結構しょうもない実装しているのがあったり
かっこよくて真似したいものが合ったりいろいろだけど。

そして自分で実装するときは
かっこいいコードになるように
気をつけて実装するようになるのよ。

投稿日時 - 2009-03-09 17:11:17

お礼

ありがとうござました。

投稿日時 - 2009-03-18 14:37:20

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.6

#4です。
まず
> スーパークラスまでスローさせて、
について。
>> 上位にスルーする
ってのはスーパークラスまでスローするっていう意味で書いたわけではありません。
スーパークラス/サブクラスってのは継承というキーワードで出てくるのでそちらを参考にしてください。
私が上位にって書いたのは、単純に呼び出し元のクラスという意味です。

で、どちらで処理するかっていう問題は、どういう例外処理を行いたいかってことと関係してきます。
たとえば、例外が発生したらエラーメッセージを出力して処理終了というように処理したいのであれば、呼び出し元でかまわないだろうし、
ログに出力して次の処理に進みたいとか、そこにカーソルを指定したいとかであれば、あまり上位のクラスでは処理できなくなるでしょう。

投稿日時 - 2009-03-07 10:57:54

お礼

ありがとうござます。

上位にスローするというのは、例外処理をせずにエラーを放置して、
処理を進めるということですか。

基本はメソッドのエラーをクラス内で処理して、
場合によっては、ログだけ残して処理を続行して、
規模が大きくなると、例外クラスを拡張するわけですね。

大変為になりました。

投稿日時 - 2009-03-09 15:06:28

ANo.5

> java.langのフレーム左にある例外一覧は何を指しているのでしょう?
例外クラスがjava.langパッケージに所属している
ていうだけよ。
Stringがjava.langパッケージにあるのと同じ。
別にjava.langパッケージで出る例外って意味じゃないわよ?
(私も最初のころは同じ勘違いをしたわ・・・(遠い目


> あと、replaceAllはPatternSyntaxExceptionだけではないのですか?
Stringでgoogle先生に質問したときに出てきたAPIドキュメントがJDK1.4のものだったみたい。
1.4の場合はNullPointerExceptionが書かれていたのよ。
1.5以降では書かれなくなったみたいね。
これは失礼したわ。ごめんなさい。

> それとRuntimeExceptionは対処しようがないので、
> 例外処理はしないと本に書いていました。exceptionだけ拾えと書かれていました。
その本は間違っているわ。
たとえば次のコードを見て頂戴。
String data = null;
if (data.equals("test")) {
System.out.println("dataはtestと等しい");
}
これを実行するとdataがnullなため、
data.equals("test")でNullPointerExceptionが出るわ。
でも、
if (data != null && data.equals("test"))
こう記述したり
if ("test".equals(data))
こう記述することでNullPointerExceptionの発生は対処できるのよ。
対処のしようがないなんてことはないわ。

こういう風に、RuntimeExceptionは対処しないとかではなく
RuntimeException系は発生しないように実装するが表現としては正解よ。

投稿日時 - 2009-03-06 15:28:26

お礼

ありがとうござます。

そうです。
本もRuntimeException系は発生しないよう実装するので、
コードにまで例外を書く必要がないという思想でした。

if (data.equals("test")

if ("test".equals(data)

みたいな、現場の知恵みたいなものはどうやって身に付けていくのですか?

投稿日時 - 2009-03-09 15:00:40

ANo.4

#1です。
補足です。

> それでjava.langパッケージを使うときは、ここに表示されている例外をtryで拾うのかと思いました。
APIのパッケージ java.lang に例外は27あってその中で RuntimeExceptionから継承されていないのがこの3つだったのですね。
知りませんでした。
すみません。

実はEclipseとかでコード書いていると自動でエラーが判定されるので、RuntimeException かどうかなんてあんまり意識してないんですよねぇ。
だめだなぁ。

前例の IndexOutOfBoundsException は RuntimeException ですね。
だから必ずしもキャッチして例外処理するか又は上位にスルーする必要はありません。
ただ引数indexを手入力値とかで入力チェックするのが面倒であればキャッチして例外処理してもいいかなぁ。と思います。

> 使うメソッドの例外を飛ばせばいいのですか?
基本そうです。
JAVADOCみて判断ですね。
#2さんのおっしゃってるとおり、Exceptionクラスを継承して独自のExceptionを作ってそれをスルーする場合も同じです。
(これはまだ早いかな。)
キャッチして例外処理するか又は上位にスルーするかは開発者の好みというか周りとの連携というとこなんですけどね。

投稿日時 - 2009-03-04 19:41:30

お礼

ありがとうございます。

Eclipseを入れました。入力補助としても使えていません。
自動でエラー判定されることも知りませんでした。

プラグインやフレームワークもまだ先になりそうです。
プログラムすら作れないので・・

例外処理については、だいたいわかって来ましたが、
このままだと1つのクラスに使うメソッド分の例外を
1つのクラス毎に書くことになります。

ある程度スーパークラスまでスローさせて、
スーパークラスにまとめて書きますか?

投稿日時 - 2009-03-06 15:08:57

ANo.3

クラスを使用することと
例外が発生することには
何の関連もないわ。

重要なのはクラスではなくメソッドなの。

あるメソッドを利用するとき
どんな例外が発生するのかが重要なのよ。
例えば
java.lang.StringのreplaceAll(String,String)
を使うわ。
このクラスを実行する際に起きる可能性のある例外に
PatternSyntaxExceptionとNullPointerExceptionがあるわ。
(APIドキュメントより)
このなかで必ずcatchしなくてはいけないものは1つもないわ。
なぜならPatternSyntaxExceptionとNullPointerExceptionは
RuntimeExceptionだからなのよ。

でも、
java.lang.StringのgetBytes(String)
の場合に発生する可能性のある例外
UnsupportedEncodingException
はcatchしないといけないわ。
この例外はRuntimeExceptionじゃないもの。

投稿日時 - 2009-03-04 16:50:25

お礼

ありがとうございます。

クラスではなくメソッドの例外をトライ&キャッチすることはわかりました。
java.langのフレーム左にある例外一覧は何を指しているのでしょう?



あと、replaceAllはPatternSyntaxExceptionだけではないのですか?
>replaceAll
>例外: PatternSyntaxException - 正規表現の構文が無効な場合
なぜ、replaceの例外であるNullPointerExceptionも含むのですか???

それとRuntimeExceptionは対処しようがないので、
例外処理はしないと本に書いていました。exceptionだけ拾えと書かれていました。

たいへんためになりました。

投稿日時 - 2009-03-06 14:54:39

ANo.2

java.lang.StringクラスのほとんどのメソッドはRuntimeExceptionを継承した例外しかthrowしないため明示的にtry~catchまたは例外をthrowしなくてもコンパイルは通ります。

ですが実際には
String str = null;
str.subString(0,1);

なんて実行したら例外が発生します。

普通subStringする前にstrの値はnullでなく長さが1以上あるというチェックをしているからです。(例外が発生するということはプログラムに問題がある)

Exceptionを継承した例外のthrowされるメソッドを呼び出した場合は当然ながら呼び出した場所でtry~catchするかさらにthrowしなければコンパイルエラーが発生します。(例外が発生する原因が必ずしもプログラムに起因しないため)

public static void main(String[] args) {
try{
ReigaiDasuze();
}catch(IOException e){
System.out.println("例外キター");
}
}

private static void ReigaiDasuze() throws IOException{
throw new IOException("例外なんだぜ?");
}

例えばネットワークがからむプログラム等では通信が切れる等予期しない例外が発生したりすることがあるからです。

投稿日時 - 2009-03-04 16:34:32

お礼

ありがとうございます。

ただ、何が言いたいのかわかりません・・・

投稿日時 - 2009-03-06 14:44:21

ANo.1

どうしてこの3つだけは必要だと思うのですか?
・・・・
例外は使うクラス及びメソッドによって決まります。
例えば
java.lang.StringのcharAt()メソッドを使えば
IndexOutOfBoundsExceptionが発生する可能性があるから
これをキャッチして例外処理するか又は上位にスルーする必要があるのです。

投稿日時 - 2009-03-04 15:48:18

お礼

すみません。素人なんです。
インターフェースと列挙型と注釈型の使い方がまだわかっていないレベルです。

ただいま、クラスのメソッドと例外処理の使い方をマスターしようとがんばっています。

Java(TM) SE Development Kit Documentation 6 for Japanese (57.22 MB)
をダウンロードしました。

そして、java.langをクリックしました。
すると、

インターフェース
クラス
列挙型
例外
エラー
注釈型

の6つのクラスが表示されました。

それでjava.langパッケージを使うときは、ここに表示されている
例外をtryで拾うのかと思いました。


使うメソッドの例外を飛ばせばいいのですか?

charAt
例外:
IndexOutOfBoundsException - index 引数が負の値、または文字列の長さと同じかこれより大きい値の場合

大変ためになりました。

投稿日時 - 2009-03-04 16:39:36