代码之家  ›  专栏  ›  技术社区  ›  gmhk

引发JDBC空指针异常

  •  1
  • gmhk  · 技术社区  · 14 年前

    嗨,我在rs.next()或rs.getstring(1)处收到了nullpointerexception 很奇怪,有时rs.next()工作正常,它在rs.getstring(“productcode”)上抛出nullpointerexception,有时在rs.getstring(“proddate”)上抛出npe。 我不明白为什么rs.getstring()会运行npe,而rs.next()却运行良好

    这是我的密码

    { 
    ResultSet rs = null;
    String query = "";
    BarcodeBean bi = null;
    try {
    query = "SELECT * FROM TABLE(GET_BARCODEINFO('"barcode.trim()"'))";
    
    statement = connection.createStatement();
    Logger.getInstance().getLogger().logInfo(query);
    rs = statement.executeQuery(query);
    
    bi = new BarcodeBean();
    
    if (rs == null){
    if(rs.next()){
    
    bi.setUrunKodu(rs.getString("PRODUCTCODE"));
    bi.setImalatMakineKodu(rs.getString("PRODMACHINECODE")); 
    bi.setOperatorSicilNo(rs.getString("OPERATORID")); 
    bi.setImalatTarihi(rs.getString("PRODDATE")); 
    bi.setImalatVardiyasi(rs.getString("PRODSHIFT"));
    bi.setSeriNumarasi(rs.getString("SERIALNUMBER"));
    bi.setSirtTarihi(rs.getString("SIRTTARIHI"));
    }
    }
    } catch (SQLException e) {
    e.printStackTrace();
    throw e;
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    
    DatabaseUtility.close(rs);
    DatabaseUtility.close(statement);
    
    }
    } 
    
    4 回复  |  直到 13 年前
        1
  •  3
  •   dfa    14 年前

    也许你想要:

    if (rs != null) {
       if (rs.next()) {
    

    或者更好:

    if (rs != null && rs.next()) {
    

    你的测试完全错了。

        2
  •  3
  •   BalusC    14 年前

    Statement#executeQuery() 从未 收益率 null . 整张空支票是 多余的 . 通常的成语是这样的:

    public Entity find(Long id) throws SQLException {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Entity entity = null;
    
        try {
            connection = database.getConnection();
            preparedStatement = connection.prepareStatement(SQL_FIND);
            preparedStatement.setLong(1, id);
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                entity = new Entity();
                entity.setId(resultSet.getLong("id"));
                entity.setName(resultSet.getString("name"));
                // ...
            }
        } finally {
            close(connection, preparedStatement, resultSet); // In reversed order.
        }
    
        return entity;
    }
    

    你的 实际的 问题出在别的地方。这显然是对stacktrace的误解。要正确地确定它,您需要查找stacktrace中第一行的行号,并将准确的代码指向这个行号。

        3
  •  2
  •   Roman    14 年前

    Statement javadocs :

    public resultset executequery(string sql)引发sqlexception

    退换商品 :结果集 包含生成的数据的 通过给定的查询; 从不空

    所以,你不需要验证 rs == null .

    处理结果集行的标准方法是:

    while (rs.next ()) {
       doSmth (rs);
    } 
    
        4
  •  0
  •   Venkat    14 年前

    你在if条件下记错了,

    所以把它改成, 如果(RS)!{NULL){ …… ……}