在Java连接数据库时,有时候在ResultSet 调用getString (或其他类似的方法),有时候会抛出NullPointException,异常信息如下:
java.lang.NullPointerException com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1059) com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2719) org.apache.jsp.delete_jsp._jspService(delete_jsp.java:110) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
但是通过debug发现ResultSet 对象不为空,这个问题就比较头疼,网上也有很多人在提问,但是大多都没有找到问题的根本原因。出现这个问题是因为多个ResultSet 使用了一个Statement或者PrepareStatement对象而导致,比如下面的代码:
Statement stat = conn.createStatement(); try { ResultSet rs = stat.executeQuery("select * from BbsRecord where id=" + id); rs.next(); sid = rs.getInt("sid"); ResultSet rss = stat.executeQuery("select * from bbsrecord where sid=" + sid); rss.last(); if (rss.getRow() == 1) { if (rs.getInt("root") == 0) { //错误报告指示的是这里 stat.execute("update bbsrecord set leaf = 1 where id=" + sid); stat.execute("delete from bbsrecord where id =" + id); if (rs.getInt("leaf") == 0) { delete(conn,id); } } } else { stat.execute("delete from bbsrecord where id =" + id); if (rs.getInt("leaf") == 0) { delete(conn, id); } } rs.close(); rss.close(); } catch (SQLException e) { System.out.println("sql异常"); } finally { stat.close(); conn.close(); }
在上述代码中,由于第6行和第3行使用同一个Statement,导致了第9行抛出的NullPointerException异常
相关推荐
例如,`resultSet.getInt(1)`或`resultSet.getString("columnName")`。 4. 遍历结果集:为了完整遍历ResultSet,你需要在while循环中使用next()方法,直到它返回false为止。示例代码如下: ``` while (resultSet....
supplierData.put(Integer.valueOf(resultSet.getInt("sup_id")), resultSet.getString("sup_name")); } catch (Exception e) { e.printStackTrace(); } return supplierData;//返回映射关系 } public ...
resultSet.getString (5), resultSet.getString (6), resultSet.getString (7), resultSet.getString (8) ); preparedStatement.close (); ConnDB.terminate(); return users; } else { preparedStatement....
ResultSet 通过一套 get 方法访问当前行中的不同列,例如 getInt、getString、getFloat 等。 在使用 ResultSet 之前,需要先执行 SQL 语句,并将结果存储到 ResultSet 对象中。例如: ```java java.sql.Statement ...
ResultSet 转为 List ResultSet 转为 List<Map> 是一种常见的数据处理操作。在 Java 中,使用 JDBC 连接数据库时,通常会返回一个 ...8. SQLException:SQLException 是 Java 中的异常类,用于抛出数据库操作异常。
- `ResultSet.getString(int columnIndex)`:用于获取指定列的字符串值。 - `ResultSet.getInt(int columnIndex)`:获取整数值,其他类型也有相应的方法。 - `ResultSet.next()`:移动游标到下一行,如果还有数据则...
user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); userList.add(user); } ``` 4. 将List转换为JSON字符串: 使用Jackson的ObjectMapper进行转换: ```java ObjectMapper...
获得结果集的字段名称_ResultSet的属性要调用ResultSetMetaData的方法 在Java中,获取结果集的字段名称可以通过调用ResultSetMetaData的方法来实现。ResultSetMetaData是一个公共接口,提供了关于ResultSet对象中列...
每行数据通过调用getXXX()方法(XXX代表数据类型)获取,例如getString()、getInt()等。 创建JavaBean时,我们通常定义一个类,包含与数据库表列相对应的属性,并提供getter和setter方法。例如,如果数据库表有id、...
这段代码首先获取了`ResultSet`中的列数,然后遍历每一列并打印出其名称。 #### 2. ResultSet对象定位与移动 - `boolean absolute(int row)`:将光标移动到指定行号。 - `void afterLast()`:将光标移到最后一行...
在Java编程语言中,`ResultSet`是用于存储和处理数据库查询结果的核心接口。它是由`Statement`或`PreparedStatement`执行SQL查询后返回的结果。本文将深入探讨`ResultSet`的使用方法,结合源码分析和实用工具,以...
### CallableStatement调用Oracle存储过程返回结果集(ResultSet) #### 一、无返回值的存储过程调用 在本节中,我们通过一个具体的例子来详细介绍如何使用`CallableStatement`来调用Oracle数据库中的无返回值存储...
ResultSet是Java数据库连接(JDBC)中的一个重要接口,它用于存储和检索数据库查询结果。当执行SQL查询后,结果会被封装成ResultSet对象,允许我们逐行遍历并访问查询返回的数据。在处理ResultSet时,了解其属性和元...
boolean isAutoIncrement = resultSet.getString("Extra").contains("auto_increment"); // 是否自增 boolean isPrimaryKey = resultSet.getString("Key").equals("PRI"); // 是否为主键 System.out.println(...
// 访问结果集中每一行的列,如:resultSet.getString("column_name"); System.out.println(resultSet.getString("column_name")); } ``` 最后,别忘了关闭所有的资源,包括`ResultSet`, `CallableStatement`和`...
总结来说,从Java存储过程返回JDBC ResultSet作为REF CURSOR,主要是为了解决Oracle数据库的特性和JDBC的兼容问题。通过Oracle9i引入的特性,开发者可以利用这种方法在PL/SQL和Java之间更灵活地交换数据。然而,这种...
本篇将详细阐述如何使用CallableStatement调用Oracle存储过程并处理返回的结果集。 一、无返回值的存储过程 对于无返回值的存储过程,如`PRO_1`,它的任务是根据传入的参数进行插入操作。在Java中,我们可以通过...
- `rs.absolute(int n)`:将游标移动到指定的行号,n为行号,如果n无效(如负数或超过总行数),则抛出异常。 - `rs.relative(int n)`:相对当前行移动n行,可以正向或负向移动。 - `rs.first()` 和 `rs.last()`...
本篇将详细介绍如何使用CallableStatement调用Oracle存储过程,并处理返回的结果集(ResultSet)。 一、无返回值的存储过程 在Oracle中,一个无返回值的存储过程可能只执行某些操作,例如插入数据。以下是一个简单...
这个问题其实也很简单,因为PreparedStatement接口必须通过Connection接口来获取实例,而ResultSet接口又必须从Statement或者PreparedStatement接口来获取实例,有了这样的级联关系,问题也就迎刃而解了。...