私は、文字列の日付と時刻を解析するためのいくつかのメソッドを含むライブラリを作成しています。私は、文字列引数が解析できないときにそれらのメソッドがスローするべき例外を決定するのが難しいです。 - 無効な文字列は明らかに不正な引数ですが、私には、IllegalArgumentException
は通常、プログラミングエラーを意味し、それがいずれかの明示的なtry catch
をやりたいことはまれだJava APIの設計:半数値文字列を解析するメソッドのNumberFormatException?
1. java.lang.IllegalArgumentException
:私はいくつかのオプションを検討しています。私は、文字列の解析はしばしば外部入力用であり、特別な扱いを受ける特別なケースであると考えています。たとえば、ユーザー入力を解析して何か他のことをした大きなコードブロックがあった場合、try catchブロックにそのコードをラップして、無効な文字列を含むユーザー入力の大文字小文字を処理することができます。しかし、IllegalArgumentException
をキャッチすることは、無効なユーザー入力を正確に特定するためにはあまり役に立ちません。なぜなら、ユーザー入力パースだけでなく、スローされる可能性のあるコード内に複数の場所がある可能性が高いからです。
2. java.lang.NumberFormatException
- それはjava.lang
にInteger.parseInt(String)
および他の同様の解析メソッドによってスローされます。だから、ほとんどのJava開発者は、有効であるかもしれない文字列(例えば、ユーザ入力)を解析しようとしているときに例外をキャッチすることに慣れている。しかし、それはその名前に「数字」を持っているので、ある意味では数値であるが、概念的には私の心の中では異なる日付や時刻には本当に合っているのか分からない。 "FormatException"とだけ呼ばれた場合...
3. java.text.ParseException
- チェックされているため、実際にはオプションではありません。私はこれをチェックしないことを望む。
4.カスタム例外 - これはIllegalArgumentException
とNumberFormatException
の欠点を回避して、それがあまりにもIllegalArgumentException
を拡張することができます。しかし、本当に必要な場合を除いて、ライブラリに例外を追加することは良い考えではないと思います。ジョシュ・ブロッホを引用して、"If in doubt, leave it out"。 (また、私の場合、日付と時刻を解析するパッケージでは、「DateFormatException」、「TimeFormatException」、「CalendricalFormatException」(JSR 310など)日付、時間などを解析します。そして、解析できない文字列を特定するために使用されているのであれば、複数の例外を1つのパッケージに作成するのはばかげているでしょう)
センス?
NB java.util.DateまたはJoda Time、つまりJSR 310を使用したくないという理由があります。そのため、それらを提案する必要はありません。さらに、この質問がかなり一般的に行われていれば、APIを設計している他の人たちが苦労している問題であるため、これが良いと思います。日時には、IPアドレスやURL、または解析が必要な文字列形式の情報の他の種類の情報もあります。その他のライブラリで設定し
先例は
ほんの一例は、私が見つかりました:
java.sql.Timestamp.valueOf(String) throws IllegalArgumentException
java.util.Date.parse(String) throws IllegalArgumentException
(非推奨メソッド、および例外が宣言されていませんが、あなたがそれを見ることができますソース)
java.util.UUID.fromString(String) throws IllegalArgumentException
org.apache.axis.types.Time(String) throws NumberFormatException
は(Apache Axisの中にも、デイクラス)
org.apache.tools.ant.util.DeweyDecimal(String) throws NumberFormatException
com.google.gdata.data.DateTime.parseDateTime(String) throws NumberFormatException
java.lang.Package.isCompatibleWith(String versionString) throws NumberFormatException
(Javaの7で、これはドットで文字列のバージョン番号がとる - の種類の中に日付や時刻のような感覚)
カスタム例外を使用するパッケージがたくさんあると思いますので、それらの例を挙げることに多くの点があるのでしょうか。
:)にそれがキャッチ望んで、私よ
...それ定義によって物事のJavaの道なり戻り値にエラーを含めることに強く反対します。これには、膨大なレスポンスオブジェクトまたは返されるObjectが必要です。両方とも、単純なAPIを使用できなくする可能性があります。 –
+1 @ sean-patrick-floyd:nullが返される可能性があります。その場合、bloatはコード内にあり、再び使用できなくなります。 – subsub
それは確かに味の問題です。私はparseOrNull(String)のようなメソッドを使用することを検討しましたが、コアJDKライブラリによって設定されたようなJavaのやり方に実際には合っていないと思います。加えて、100%が有効であると予想される文字列を解析している場合には、NullPointerExceptionを無駄にしたり、役に立たないNullPointerExceptionを取得したりすることになります。 –