2017-09-11 71 views
1

このエラーに関する似たような話題がたくさんあることは知っていますが、私はいくつかの提案を試みましたが、私の問題はまだ保存されていません。 私はこのチュートリアルを次のようだ:ここではhttps://www.youtube.com/watch?v=B3gEbC37DAM&list=PL1A506B159E5BD13E&index=2潜在的なヌルポインタアクセス。変数は、この場所ではnullになることがあります。 java.lang.NullPointerException

は私のコードです:オン

public class JdbcDaoImpl {  
    public Circle getCircle(final int circleId) { 
    Connection conn = null; 

    try { 
     String driver = "org.apache.derby.jdbc.ClientDriver"; 
     Class.forName(driver).newInstance(); 
     conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); 
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM circle where id= ?"); 
     ps.setInt(1, circleId); 

     Circle circle = null; 
     ResultSet rs = ps.executeQuery(); 
     if (rs.next()) { 
      circle = new Circle(circleId, rs.getString("name")); 
     } 
     rs.close(); 
     ps.close(); 
     return circle; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 

    } finally { 
     try { 
      conn.close(); 

     } catch (SQLException e) { 
     } 

    } 
    } 
} 

"(はconn.close);"潜在的なヌルポインタアクセス。変数は、この場所ではnullになることがあります。私は、私はこの1つのように類似したトピックに見たソリューションを試みた

スレッドの例外「メイン」のjava.lang.NullPointerException: と私はプログラムを実行すると、私はこのエラーを持っている

if(conn!=null){ 
    conn.close(); 
} 

をしかし、私はまだ持っていますエラー。

ありがとうございました!

+2

他のエラーは何ですか? –

+0

'if'ステートメントを実行すると、どのようなエラーが発生しますか? – alirabiee

+1

デバッグヘルプ(「なぜこのコードは機能していませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法。あなたの*質問を改善するために "編集"リンクを使用してください - コメントでより多くの情報を追加しないでください。ありがとう! – GhostCat

答えて

-1

connがnullでもよい理由は簡単です。 conn前に実行されるコードは、このコードが正常に実行さすなわち前に、asignedされている場合:

String driver = "org.apache.derby.jdbc.ClientDriver"; 
Class.forName(driver).newInstance(); 
conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); 

このコードはnullにしないconnのために正常に実行する必要があり、したがって、あなたはそれにclose()を呼び出す前にnull以外のチェックを必要としています。

0

Java> = 1.6を使用していると仮定して、ドライバを明示的に読み込む必要はありません(Class.forName)。

あなたがしよう - と、リソースAutoCloseableオブジェクト(ConnectionPreparedStatement、およびResultSet)を管理するので、あなたのコードは次のように書くことができます使用することができます。これはまた、すべてのリソースが適切に閉じられている保証

public Circle getCircle(final int circleId) { 
    try (Connection conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); 
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM circle where id= ?")){ 
     ps.setInt(1, circleId); 

     Circle circle = null; 
     try (ResultSet rs = ps.executeQuery()) { 
     if (rs.next()) { 
      circle = new Circle(circleId, rs.getString("name")); 
     } 
     } 
     return circle; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    } 

、リソースリークのために発生する可能性がある多くの問題を解決します。

getConnectionが例外をスローし、connをnullにして、後でfinallyブロックで閉じようとしたときにnullポインタが発生するという問題がありました。 conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db");があなたのcatch (Exception e)によってキャッチされNullPointerExceptionをスローし、あなたがconn.close()を行う場所、finallyブロックが実行され始めているが、ときあなたは潜在的なNullPointerExceptionを得ることができる場所、トライキャッチを使用している間、finallyブロックが常に実行され

0

であるあなたconnオブジェクトはNULLです。もう一度スローします。catch (SQLException e)

関連する問題