今天一个朋友问了我个java连接数据库的问题, 他说, 他做了一个jdbc的工程,用来控制一些html静态页面批量生成, 在本地运行都很顺利,页面也能生成出来, 可部署到服务器上就出现了问题: 异常信息如下:java.lang.NullPointerException
oracle.jdbc.driver.OracleResultSetImpl.internal_close(OracleResultSetImpl.java:627)
oracle.jdbc.driver.OracleResultSetImpl.close(OracleResultSetImpl.java:118)
com.publish.dao.SmSoftProductSelectImpl.getRecommandVosBysmTypeId(SmSoftProductSelectImpl.java:287)
com.publish.service.HtmlService.getSmLinkVosBysmTypeId(HtmlService.java:146)
com.publish.service.HtmlService.createMoreHtml(HtmlService.java:580)
com.publish.build.createHtml.doPost(createHtml.java:111)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)据他所说也并不是一部署到服务器就出现了问题, 而是运行过程中出现的这个问题, 本地和服务器环境一样,Oracle版本也是一样, 看了他的程序,也很迷糊, 因为时间很仓促,我也没再去帮他调试了,自己手头上一大堆活,在google 上搜了下,回答都很抽象, 所以请各位有经验的大哥帮帮忙, 看一下这个问题主要是尤什么诱发的谢谢啦..
(注:
com.publish.dao.SmSoftProductSelectImpl.getRecommandVosBysmTypeId(SmSoftProductSelectImpl.java:287)
if(rs!=null){
try {
rs.close(); // 这里就是 287行,但为什么这里会报空指针,请作解释
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
)
感触: 工作两年了,却被这个jdbc迷糊了, 深感羞愧.......
oracle.jdbc.driver.OracleResultSetImpl.internal_close(OracleResultSetImpl.java:627)
oracle.jdbc.driver.OracleResultSetImpl.close(OracleResultSetImpl.java:118)
com.publish.dao.SmSoftProductSelectImpl.getRecommandVosBysmTypeId(SmSoftProductSelectImpl.java:287)
com.publish.service.HtmlService.getSmLinkVosBysmTypeId(HtmlService.java:146)
com.publish.service.HtmlService.createMoreHtml(HtmlService.java:580)
com.publish.build.createHtml.doPost(createHtml.java:111)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)据他所说也并不是一部署到服务器就出现了问题, 而是运行过程中出现的这个问题, 本地和服务器环境一样,Oracle版本也是一样, 看了他的程序,也很迷糊, 因为时间很仓促,我也没再去帮他调试了,自己手头上一大堆活,在google 上搜了下,回答都很抽象, 所以请各位有经验的大哥帮帮忙, 看一下这个问题主要是尤什么诱发的谢谢啦..
(注:
com.publish.dao.SmSoftProductSelectImpl.getRecommandVosBysmTypeId(SmSoftProductSelectImpl.java:287)
if(rs!=null){
try {
rs.close(); // 这里就是 287行,但为什么这里会报空指针,请作解释
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
)
感触: 工作两年了,却被这个jdbc迷糊了, 深感羞愧.......
解决方案 »
- 请教一个JAVA泛型的问题
- struts action问题
- 用户名,手机等不能重复是放在一个方法里面处理还是分别处理?
- 跪求struts和jbpm整合的实例~~
- 如何实现通过分析txt文档中某个字段,能够得到要求输出!
- hibernate 对image类型的操作
- 读文本问题?
- 我使用websphere的application server 5.0 版本 ,它自带的jdk怎么是1。3版本的??? 有谁知道如何使was5.0环境下使用jdk1.4的啊?
- 请问哪位有MVC、Struts方面的电子书
- 怎么设定从xml转换成html后的缺省字符集?
- hibernate 一对多的查询效率问题
- spring.net 属性切入点配置问题
rs 是 ResultSet 对象...
try {
rs.close(); // 这里就是 287行,但为什么这里会报空指针,请作解释
} catch (SQLException e) { 有可能吗?这里的rs已经不可能是null了吧,if(rs!=null)这不是判断了吗?
如果你先关conn或者ps,rs!=null,但是rs已经被关闭了噢
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
JDBCAccess.closeConnnection(conn);
}
com.publish.service.HtmlService.createMoreHtml(HtmlService.java:580)
com.publish.build.createHtml.doPost(createHtml.java:111)
这几行也可能是空
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class DBCon {
public static String driver="oracle.jdbc.driver.OracleDriver";
public static String url="jdbc:oracle:thin:@192.168.0.174:1521:ORCL";
public static String user="scott";
public static String pwd="tiger";
public static Connection getConnection(){
try {
Class.forName(driver);
Connection con=DriverManager.getConnection(url, user, pwd);
System.out.println("con success");
return con;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void close(Connection con,Statement stm,ResultSet rs){
if(con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(stm!=null){
try {
stm.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
DBCon.getConnection();
}
}
Connection con=DBCon.getConnection();
......
finally{
DBCon.close(con, stm, rs);
}
这里就拿12楼程序说明:
对于这个方法:
public static Connection getConnection(){
try {
Class.forName(driver);
Connection con=DriverManager.getConnection(url, user, pwd);
System.out.println("con success");
return con;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
静态的得到一个连接, 毫无疑问,这个方法是正确的,但不知道大家有没有批量生产上万条记录经验,(将数据转换为物理文件), 有个时候生成了上千条的时候就不执行了,好像哪被堵死了一样,文件不在增长,页面也不报异常,log也没显示,就停住了..., 但如果把此方法改成为
public Connection getConnection(){
return conn;
}就可以解决上述问题, 有点怪哉...
望高人指点....