ジャバ:Integer = null に設定しても問題ありませんか?
-
22-09-2019 - |
質問
引数がデータベースに存在する場合に ID 番号を返す関数があります。そうでない場合は、null を返します。これはヌルポインタ例外を要求しているのでしょうか?負の ID 番号は許可されませんが、存在しない引数は -1 のようなエラー コードではなく null を返す方が明確だと思いました。どう思いますか?
private Integer tidOfTerm(String name) throws SQLException {
String sql = "SELECT tid FROM term_data WHERE name = ?";
PreparedStatement prep = conn.prepareStatement(sql);
prep.setString(1, name);
ResultSet result = prep.getResultSet();
if (result.next()) {
return result.getInt("tid");
}
return null; // TODO: is this begging for a null pointer exception?
}
解決
これは完全に合法です。あなたはNPEを避けたい場合は、カスタム例外をスローします。しかし、負の数を返しません。呼び出し側が戻り値をチェックしない場合は、常に問題があります。しかし、(結果は、例えばあるためで-1掛け)は、の偽の計算を行うことは、間違いなく難しく、デバッグにuncatched例外を超えています。
他のヒント
の結果が非existanceを表す通常の方法で得ないルックアップの場合null
を返します。私は、この場合には、それを選ぶだろう。 (標準のJavaマップクラスのルックアップ方法は、マップがキーが含まれていない場合はnull
を使用するための一例です。)
IDのための特別な値を返すように、私は、あなたのシステムがすでに特別なIDのをrepesenting特別な値が含まれている場合はそれを行うことを提案する考えます。
別しばしば聞いた可能性は、この場合に例外をスローしています。私はどちらかそれをしないだろうので、それは、状態を渡すために使用例外にしかし、賢明ではありません。
私はこの場合にはnullを返すことが正当であると思います。ただ、意図が適切に文書化されていることを確認します。
この場合、返却負の値は大丈夫だろうが、それはすべての周りのソリューションではありません。どのような負の値はデシベルで許可された場合はどうなりますか?
編集:私はSO返すヌルまたは空のリスト(または配列)についての関連ディスカッション単語を追加します。私は空のリストや配列の代わりに、ヌルを返すに賛成ですが、の文脈のは異なっています。リストを取得しようとすると、それは通常、親オブジェクトの一部であり、親オブジェクトではなく、ヌル参照の空のリストを持っていることが実際に意味があります。この場合は、nullが意味を持っている(=見つからない)と、それを返す避けるために理由はありません。
私はこれがあなたのための本当の方法ではありません願っています。あなたは、メソッドのスコープ内StatementまたはResultSetを閉じていないされます。
エラーコードは使用しないでください。どの値がエラーになっているのでしょうか?正当な戻り値になることはありませんか?何も勝てなかった。
ヌルはダメだよ。ほとんどの呼び出し側コードは、結果に対して null でない場合のチェックを行う必要があります。また、場合によっては、select が null を返す場合があります。行がない場合とは別の方法で処理する必要がありますか?
null を返す代わりに、NoSuchElementException のような例外をスローします。これはチェックされていない例外であり、呼び出し元はそれを処理することも、無視することもできます。また、呼び出し元が処理したい場合、try catch は if not null よりも複雑ではありません。
私はあなたがオプションのパターンを考える示唆ます。
はオプションのパターンは、あなたの返される型のラッパーとして動作し、2つの特殊なケースを定義しています。option.none()とoption.some()。その方法は、あなたが常にあなた返さタイプ(オプション)を知っている、とあなたは、このようなoption.isSome()とoption.isNone()などのメソッドを使用して、返されたOptionオブジェクトの値を持っているかどうかを確認することができます。
この方法で、あなたは未チェックのヌルを持っていない保証することができます。
もちろん、このすべては、追加のコードの複雑さを犠牲にしています。
はオプションタイプの詳細については、(ここを見ますScalaのコードが、同じ主)
いいえ、それはしません。それをnullcheckingずに原始的であるかのようにあなたが後でそれに対して操作を行う場合にのみNPEをスローします。例えば。 i++
のように。あなたの例では有効です(JDBCコード自体がリソースをリークしていることから期待します)。あなたが実際id
を必要としない場合は、一方だけでもboolean
を返すことができます。
これは、初心者ユーザーのための大きな問題を引き起こす可能性があります。グッドコーダーは名前が無効で、その後null
ある場合に返されるかもしれないことを認識するだろう。より標準的なものがいくつかexception
をスローすることであると言ってます。
オートボクシングの組み合わせに注意が必要かもしれません。 私はこれをやっている場合:
final int tid = tidForTerm("term");
そして「という用語は、」Javaのプリミティブint型の整数(null)をVHS版しようとするため、私は、NPEを取得する、存在しません。
それにもかかわらず、整数のヌルを使用するように、実際に良いことだ例があります。例えば、任意のint値を有するエンティティで市の人口。その場合はnullがいない情報が利用可能に、意味します。
興味深い問題と、考えられる多数の解決策:
- HasArgument メソッドを作成し、ユーザーにそれを呼び出すように要求します。これは時間がかかり、作業が重複する可能性があります。
- 値がデータベースにない場合は例外をスローします。これが予期しない場合にのみ使用してください。
- 追加の値を使用して無効な戻り値を示します。null および負の値は機能しますが、チェックされていない場合、コードの後半で問題が発生する可能性があります。
- isValid() メソッドと getValue() メソッドを含むラッパーを返します。 getValue() は、無効な場合に例外をスローします。これで 1 と 3 の問題は解決されますが、少しやりすぎかもしれません。
私は最善の解決策は、あなたのメソッドの名前は何に依存し、あなたの方法は、彼らがnullを返すか、例外をスローするかどうかを限り命名されているかを検討すべきであることを言うと思います。
tidOfTerm
1が存在しないことを発見すると、例外をスローする必要がありますので用語は、存在すると予想されていることを私に暗示ます。
、および見つけられない、それは、あなたは、IllegalArgumentExceptionをスローする場合があります、あなたのコードや環境のバグを示します。
用語名引数があなたのコントロール下にない、と有効期限を見つけていないことは完全に有効な状況であれば、、その後、私は、検索のいくつかの種類があることを行っているというわずかなヒントを与えてfindTidForTermName
ような何かにあなたの方法の名前を変更したいです行い、検索が何かを見つけることができませんかもしれないという可能性がゆえがあること。
私はポスターに同意します。整数は、ラッパーであり、そのようなものとして(私はあなたがしようとしていると思います)の計算、変換、などのために使用すべきです。それはもう少しエレガントだとあなたがより多くの制御を可能に...ヌルを返し、負の数を使用しないでください。私見ます。
リターンがヌルということではない書き込みのコードを実行してください。これは、堅牢であるために、ヌルのため一人ひとりの呼び出しあなたのコードをのMUST のチェックという。毎回。常にます。
の代わりにゼロであるかもしれない戻り値の数を含むリストを返す。
検討はい、それは、NPEの原因とされなければならないとはい、あなたは、呼び出し元のメソッド(またはいくつかの他の適当な場所)であることをキャッチしなければなりません。何のレコードと例外をスローすることですハンドルに適切な方法が存在しない場合、あなたのメソッドがNULLを返しますなぜ最も可能性が高い理由があります。そして、あなたは彼が求めたものを持っていないことを誰かに伝えるのに最適な例外は、NPEです。
エラーコード(例えば-1)を返すが良くない理由は次のとおりです。
A)あなたが処理したい多くのエラー(たとえばがある場合はDBを読み取ることができない、DBを読み取ることができますが、オブジェクトがDBに存在しない、など、オブジェクトが見つかりましたが、何かが破損している)、エラーコードを返すことは区別しません。エラーの種類ます。
将来的にはB)法律用語のIDとなった場合-1、それを変更するのは難しいだろう(あなたが使用する必要がある場合は-1、それから(EDIT:Cで)少なくともの#define ERRORCODE -1および使用を行いますどこでもERRORCODE)