0

コードは MyEclipse で動作し、正しい DB セットを返しますが、Tomcat WebService にデプロイすると、システムは NullPointerException をスローします。

奇妙なことは、デバッグ中にシステムが到達したときです。

dao.getSession();

に飛びます

session.close();

次に、「java.lang.NullPointerException」をスローします

サンプルコードは次のとおりです。

try{
    exampleTableDAO dao = new exampleTableDAO();
    Session session = dao.getSession(); //When it reaches here
    /*****************/
    /*Other Codes*****/
    /*****************/

}catch(Exception e) {
    throw e;
} finally {
    session.close(); //Jumps here and throws error
}

何時間も調べた後でも、インターネット上でヒントを見つけることができません。

4

3 に答える 3

0

dao.getSession() は Exception の catch 句ではなく、finally 句にドロップされるため、dao.getSession() は RuntimeException をスローしています。final 句では、session.close() を呼び出そうとしていて、セッションが null であるため、NullPointerException をスローしています (最初の RuntimeException が dao.getSession によってスローされたため、セッションは初期化されませんでした)。

これらすべての根本的な原因は、デプロイされたアプリケーションでデータベースへの接続が適切に初期化されていない可能性があります。接続なし == 多くの dao 例外。

于 2013-10-29T19:32:43.260 に答える
0

exampleTableDAO() は、内部的に初期化されていない外部依存オブジェクトを使用して構築されたオブジェクトを返しますか?

また、例外を再スローしています。少なくとも、スローされた例外を出力してみてください。

于 2013-10-29T19:13:24.773 に答える
0

コードが何らかの例外をスローしているようです。ただし、残念ながら、何かがうまくいかないときに何がうまくいかないのかを見つけるのが難しいような方法でコードを書いています。

まず、finallyクリーンアップを実行するブロックは、クリーンアップしようとしているオブジェクトが最初に作成されたことを常に確認する必要があります。tryブロックがオブジェクトを作成しようとして失敗し、例外がスローされた場合、ブロックfinallyは引き続き実行されますが、作成されていないオブジェクトをクリーンアップすることはできません。

これはまさにあなたのコードで起こっていることです。閉じるセッションがないときにセッションを閉じようとしているため、 NullPointerException が発生しています。

さらに悪いことに、finallyブロックからスローされた例外は、スローされた可能性のある以前の例外を置き換えます。それが何であれ失われ、代わりに NullPointerException が発生しました。

finallyしたがって、ブロック内の何かを閉じようとする前に、それが null でないことを常に確認してください

catch第二に、あなたのブロックには本当に意味がありません。それが達成するのは、実際のエラーがどこから来ているのかを覆い隠すことだけです。単純に削除することをお勧めします。

あなたが提供したコードフラグメントは不明です:ブロック内で宣言するsession名前のローカル変数に加えて、名前の付いたフィールドがあるようです。( field がない場合、コードはコンパイルされません。これは、ローカル変数がブロック内のスコープ外になるためです。)sessiontrysessionsessionfinally

次のステップは、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();
    }
}

あなたのコードがすぐに動き始める可能性は低いでしょうが、少なくとも何が問題なのかをよりよく理解できるはずです。

于 2013-10-29T19:50:22.493 に答える