かなり愚かな質問です。与えられたコード:
public static int sum(String a, String b) /* throws? WHAT? */ {
int x = Integer.parseInt(a); // throws NumberFormatException
int y = Integer.parseInt(b); // throws NumberFormatException
return x + y;
}
それが良いJavaかどうかわかりますか?私が話しているのNumberFormatException
は、チェックされていない例外です。署名の一部として指定する必要はありませんsum()
。さらに、私が理解している限り、チェックされていない例外の概念は、プログラムの実装が正しくないことを示すだけであり、さらに、チェックされていない例外をキャッチすることは、実行時に不良プログラムを修正するようなものであるため、悪い考えです。
誰かが次のことを明確にしてください:
NumberFormatException
メソッドのシグネチャの一部として指定する必要があります。- 独自のチェック済み例外(
BadDataException
)を定義し、NumberFormatException
メソッド内で処理して、として再スローする必要がありBadDataException
ます。 - 独自のチェック済み例外(
BadDataException
)を定義し、正規表現のように両方の文字列を検証BadDataException
し、一致しない場合はスローする必要があります。 - あなたの案?
更新:
想像してみてください。何らかの理由で使用する必要があるのはオープンソースフレームワークではありません。メソッドのシグネチャを見て、「OK、スローされることはない」と考えます。その後、ある日、例外が発生しました。正常ですか?
アップデート2:
私sum(String, String)
は悪いデザインだというコメントがいくつかあります。私は絶対に同意しますが、私たちが良いデザインを持っていれば元の問題は決して現れないと信じている人のために、ここに追加の質問があります:
問題の定義は次のようになりますString
。数値がsとして格納されるデータソースがあります。このソースは、XMLファイル、Webページ、2つの編集ボックスを備えたデスクトップウィンドウなどです。
あなたの目標は、これらの2を取りString
、それらをint
sに変換し、「合計はxxxです」というメッセージボックスを表示するロジックを実装することです。
これを設計/実装するために使用するアプローチが何であれ、内部機能の次の2つのポイントがあります。
- あなたが変換する場所
String
にint
- 2
int
秒追加する場所
私の元の投稿の主な質問は次のとおりです。
Integer.parseInt()
正しい文字列が渡されることを期待します。悪い文字列を渡すときはいつでも、それはあなたのプログラムが正しくないことを意味します(「あなたのユーザーはばかです」ではありません)。一方でMUSTセマンティクスを持つInteger.parseInt()があり、他方で入力が正しくない場合に問題がない必要があるコードを実装する必要があります-SHOULDセマンティクス。
したがって、簡単に言うと、MUSTライブラリしかない場合にSHOULDセマンティクスを実装するにはどうすればよいですか。