コードが何らかの例外をスローしているようです。ただし、残念ながら、何かがうまくいかないときに何がうまくいかないのかを見つけるのが難しいような方法でコードを書いています。
まず、finally
クリーンアップを実行するブロックは、クリーンアップしようとしているオブジェクトが最初に作成されたことを常に確認する必要があります。try
ブロックがオブジェクトを作成しようとして失敗し、例外がスローされた場合、ブロックfinally
は引き続き実行されますが、作成されていないオブジェクトをクリーンアップすることはできません。
これはまさにあなたのコードで起こっていることです。閉じるセッションがないときにセッションを閉じようとしているため、 NullPointerException が発生しています。
さらに悪いことに、finally
ブロックからスローされた例外は、スローされた可能性のある以前の例外を置き換えます。それが何であれ失われ、代わりに NullPointerException が発生しました。
finally
したがって、ブロック内の何かを閉じようとする前に、それが null でないことを常に確認してください。
catch
第二に、あなたのブロックには本当に意味がありません。それが達成するのは、実際のエラーがどこから来ているのかを覆い隠すことだけです。単純に削除することをお勧めします。
あなたが提供したコードフラグメントは不明です:ブロック内で宣言するsession
名前のローカル変数に加えて、名前の付いたフィールドがあるようです。( field がない場合、コードはコンパイルされません。これは、ローカル変数がブロック内のスコープ外になるためです。)session
try
session
session
finally
次のステップは、session
フィールドが存在する場合はそれを使用することです。
try {
exampleTableDAO dao = new exampleTableDAO();
// Use field.
session = dao.getSession();
/*****************/
/*Other Codes*****/
/*****************/
} finally {
// Check if field is null, and if not, close it.
if (session != null) {
session.close();
}
}
try
または、ブロック外で宣言されたローカル変数を使用するには:
Session session = null;
try {
exampleTableDAO dao = new exampleTableDAO();
// Use local variable.
session = dao.getSession();
/*****************/
/*Other Codes*****/
/*****************/
} finally {
// Check if local variable is null, and if not, close it.
if (session != null) {
session.close();
}
}
あなたのコードがすぐに動き始める可能性は低いでしょうが、少なくとも何が問題なのかをよりよく理解できるはずです。