1

以下のプログラムを開発しましたが、null ポインター例外がスローされます。

以下はモデルクラスです。

public class Circle {

    private int Id;
    public Circle(int id, String name) {
        super();
        Id = id;
        this.name = name;
    }
    private String name;
    public int getId() {
        return Id;
    }
    public void setId(int id) {
        Id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

以下はdaoクラスです..

public class jdbcdaoimpl {
    public Circle getCircle(int circleId) 
        {   
        Circle circle = null;

        try
        {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","saral","saral");
        PreparedStatement stmt=con.prepareStatement("select * from CIRCLE where id = ?");
        stmt.setInt(1,circleId);
        ResultSet rset=stmt.executeQuery();
        while(rset.next())
        {
             circle= new Circle(circleId, rset.getString("name") );
        }       
        rset.close();
        stmt.close();
        con.close();
        }                   
        catch (Exception e)
        {
            e.printStackTrace();            
        }
        return circle;
    }
}

そして最後にメインクラス..

public class jdbcDemo {

    public static void main(String[] args) {
        Circle c = new jdbcdaoimpl().getCircle(1);
        System.out.println(c.getName());
    }

}

メインクラスの実行時にヌルポインター例外がスローされているので、アドバイスしてください。

4

1 に答える 1

2

DAO メソッドですべての例外を飲み込んでいます。返しますnullnullクエリが単に空の結果を返す場合にも返されます。

closeまた、リソースに失敗しますfinally。例外を処理せずにキャッチするのではなく、例外を伝播する必要があります。

public class JdbcDaoImpl
{
  public Circle getCircle(int circleId) {
    Connection con = null;
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      con = DriverManager.getConnection(
          "jdbc:oracle:thin:@localhost:1521:xe","saral","saral");
      final PreparedStatement stmt = con.prepareStatement(
          "select * from CIRCLE where id = ?");
      stmt.setInt(1,circleId);
      final ResultSet rset = stmt.executeQuery();
      if (rset.next()) return new Circle(circleId, rset.getString("name") );
      throw new RuntimeException("Result set is empty");
    }
    catch (RuntimeException e) { throw e; }
    catch (Exception e) { throw new RuntimeException(e); }
    finally { try { if (con != null) con.close(); } catch (Throwable t) {} }
  }
}
于 2012-07-07T08:54:16.350 に答える