- - PR -
NumberFormatException が非チェック例外なのはなぜ?
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-11-17 19:16
すいません、変な言い草でした。 NumberFormatExceptionの例外検出が行われていなくても コンパイルが通ってしまう、ということを言いたかっただけです。 | ||||||||||||
|
投稿日時: 2003-11-17 21:12
うーん、なるほど。
どうにも早とちりしていたようです。 要点ズレてました、大変失礼しました。 さてさて、Java言語仕様の例外に関しての記述を読み返してみました。 http://www.y-adagio.com/public/standards/tr_javalang/11.doc.htm 「11.2.2 実行時例外を検査しない理由」 というところを見ていただくと、 今回の疑問にリンクするであろう事が書かれていますね。
さて、これを読み返したところで私の目からウロコが落ちました。 というのも私もKeisukeさんが言うように
と考えていたのですが「発生しないことを保証できない」からこそ 「非チェック」にしていた、と現実は正反対だったのです・・・。 それゆえに ubibon さんが言うように
という部分には、まったく賛同していたのですが このような理由で非チェック例外が定義されたのなら 別に catch しても良いじゃないか、と考えてしまいました。 // 調べるうちに考えが揺れてきています。 よろしければ、非チェック例外を catch する事の善し悪し、 および、その理由といった、皆様方の見解を教えて頂ければ幸いです。 >DaikiRyutoさん あ、なるほど了解です。 [ メッセージ編集済み 編集者: でくのぼう 編集日時 2003-11-17 21:12 ] | ||||||||||||
|
投稿日時: 2003-11-17 22:42
確かに。
よくやりますねえ。 プロパティファイルで数値を設定する場合、Property#getStringはStringを返すので、これをInteger#parseIntしてNumberFormatExceptionをキャッチします。 まあ、本来はよくないですよね。 それよりも、Character#isDigitを使うとすると、Stringをいちいちcharの配列にしてループで回してやらないといけないのでしょうか?みなさんはどうやって判定されてるんですか? | ||||||||||||
|
投稿日時: 2003-11-18 04:58
こんにちは、さくらばです。
こんな感じで
もちろん java.util.regex.Pattern と java.util.regex.Matcher 使ってもいいです。 [ メッセージ編集済み 編集者: さくらば 編集日時 2003-11-18 04:57 ] | ||||||||||||
|
投稿日時: 2003-11-18 12:06
Wataです。
単純なforループや正規表現でのチェックでは値域のチェック(int値の上限・下限など) はできません。そのような入力があった場合はやはりNumberFormatExceptionが発生します。 下手に自分でチェックを行うよりも、try-catchを行う方が確実でよいのでは? | ||||||||||||
|
投稿日時: 2003-11-18 12:48
なるほど、JDK1.4からは正規表現が使えますね。 ただ、Wataさんのおっしゃるように値域のチェックの問題は残ってしまいますね。 そうなると、やっぱりいきなりInteger#parseIntして例外をcatchするのが楽なのですかね。どうもこのスレッドの最初の議論からはしっくり来ない結論のような気がしますが。。。設計者に意図した使い方をを聞いてみたいですなぁ。 ともあれ、おかげさまでなんとなく分かりました。これからもInteger#parseIntしてcatchすることにします。 ありがとうございました。 | ||||||||||||
|
投稿日時: 2003-11-18 12:54
Wataです。でくのぼうさんの下記の書き込みについて...
でくのぼうさんのこの言語使用に対する解釈はまったく逆だと思います。 これはコンパイラが実行時例外を検査しない理由について説明しているので、 「プログラマにとって『発生しないことを保証することが可能』で あるが、コンパイラにとって『発生しないことを保証できない』 から、コンパイラは検査しない。」 という内容だと、私は解釈しています。 なので、「発生しないことを保証できるコーディングが可能な例外」が RuntimeExceptionのサブクラスとして定義されるべきであり、プログラマは 「発生しないことを保証するコーディング」をすることが強く求められると思います。 逆に、プログラマにとって、発生しないことを保証することが、不可能・困難・極度に非効率的 な例外はRuntimeExceptionのサブクラスにするべきでないといえると思います。 | ||||||||||||
|
投稿日時: 2003-11-18 13:32
主語を混乱していたわけですね。 確かに、コンパイラが「保証できない」だけでした。 | ||||||||||||
