servlet中连接数据库问题: exception java.lang.NullPointerException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet中连接数据库问题: exception java.lang.NullPointerException相关的知识,希望对你有一定的参考价值。
HTTP Status 500
java.lang.NullPointerException
database.DB.GetResulte(DB.java:25)
kindsOfServlet.selectServlet.doGet(selectServlet.java:45)
kindsOfServlet.selectServlet.doPost(selectServlet.java:85)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
联系代码如下:
package database;
import java.sql.*;
public class DB
Connection conn=null;
Statement stmt=null;
public DB() //连接数据库
try
Class.forName("com.mysql.jdbc.Driver");
catch (ClassNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
try
conn=DriverManager.getConnection("jdbc:mysql://localhost:8080/useToVote","root","qinx");
stmt=conn.createStatement();
catch(Exception e)
System.out.println("创建数据库连接错误!");
//实现查询功能
public ResultSet GetResulte(String sql)
ResultSet rs=null;
try
stmt=conn.createStatement();
rs = stmt.executeQuery(sql);
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
if(rs!=null)
try
rs.close();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
rs=null;
if(stmt!=null)
try
stmt.close();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
stmt=null;
return rs;
public void update(String sql)
Statement stmt=null;
try
stmt=conn.createStatement();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
try
stmt.executeUpdate(sql);
catch (SQLException e)
// TODO Auto-generated catch block
System.out.println(e.toString());
try
stmt.close();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
package kindsOfServlet;
import database.DB;
public class selectServlet extends HttpServlet
public void doGet(...)throws ...
response.setContentType("text/html");
ResultSet rs=null;
String username=request.getParameter("username");
String password=request.getParameter("password");
String sql="select * from vopwd where votor='"+username+"'";
DB db=new DB();
rs=db.GetResulte(sql);
try
while(rs.next())
if(rs.getString("password")==password)
response.sendRedirect("/useToVote/votingServlet");
。。。。。。(catch。。finally省略)
public void doPost(。。。)throws ServletException, IOException
this.doGet(request, response);
database.DB.GetResulte(DB.java:25)解决了,但问题at kindsOfServlet.selectServlet.doGet(selectServlet.java:47)
at kindsOfServlet.selectServlet.doPost(selectServlet.java:88)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
private static final String DRIVER="com.mysql.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:8080/useToVote";
private static final String USER="root";
private static final String PWD="qinx";
public Connection getConnection()
Connection conn=null;
try
Class.forName(DRIVER);
conn=DriverManager.getConnection(URL,USER,PWD);
catch (Exception e)
e.printStackTrace();
return conn;
然后在查询的GetResulte方法里面先加入conn=getConnection();开启连接,再继续往下。注意最后要关闭连接哦!希望对你有所帮助。追问
我写一个public class DB 。。。(如上代码),在servlet中如果要用到直接DB db=new DB();,这是db对象自动初始化,直接连接(连接写在初始化中),这样也没什么问题吧?
追答我知道你的意思,我有朋友也这么写了,同样跟你一样的空指针异常,理论上是没错,初始化先连接嘛。还有那样的话也会遇到一个问题,第一次可能是对的,可是刷新网页再执行一次就报错,因为你没关连接,所以开关数据库连接最好还是在方法里面。
追问我按你的方法改了,但还是那个问题,但我不知这样关闭连接对不对。异常指向我上面补充问题的代码中的while(rs.next()),你能帮我看看吗?或你联系我行吗?我邮箱lizqinzhi@hotmail.com.
追答把GetResulte方法里面的final以下全部删掉试试,不需要关闭resultset。
参考技术A 你要返回ResultSet,它是一个引用,但是你的方法里把ResultSet关闭了,所以返回来的ResultSet是关闭了的,因此发生null异常,特别记住返回ResultSet引用的时候要在外面关闭public ResultSet GetResulte(String sql)
ResultSet rs=null;
try
stmt=conn.createStatement();
rs = stmt.executeQuery(sql);
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
if(rs!=null)
try
rs.close();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
rs=null;
if(stmt!=null)
try
stmt.close();
catch (SQLException e)
// TODO Auto-generated catch block
e.printStackTrace();
stmt=null;
return rs;
本回答被提问者采纳 参考技术B 连接不上数据库的原因有
1、驱动jar包没有。
2、数据库服务没起。
3、连接字符串不正确或数据用户名密码错误。
conn=DriverManager.getConnection("jdbc:mysql://localhost:8080/useToVote","root","qinx");
你要连接mysql 你的mysql端口是配置的为8080吗 一般默认mysql端口为3306
8080为tomcat的默认端口追问
我改回端口3306还是这个问题。
参考技术C 你把连接数据库getconnection 和resultSet写在两个方法里,但是第2个方法没有获得Connection。 参考技术D 显然conn=DriverManager.getConnection("jdbc:mysql://localhost:8080/useToVote","root","qinx");
或
Class.forName("com.mysql.jdbc.Driver");
失败,导致conn未创建、而还是null追问
我想问的是为什么会连不上?
追答将 Exception 的 printStackTrace出来看具体原因
追问第一个异常解决了,但我e.printStackTrace();时,它只显示如下:at kindsOfServlet.selectServlet.doGet(selectServlet.java:47)
at kindsOfServlet.selectServlet.doPost(selectServlet.java:88)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
。。。
关于JavaWeb项目中Servlet中无法创建数据库连接池问题
今天写一个servlet项目时,将数据库的操作封装成一个普通java类,在运行时发现执行不到创建连接池的那行代码,但并不报错,用debug调试时发现有一个异常
java.lang.NoClassDefFoundError: org/springframework/jdbc/core/RowMapper
但在测试类中执行是正常的。
最后问题的解决:将项目所需的jar包放在web下WEB-INF下的lib中。
以上是关于servlet中连接数据库问题: exception java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
关于JavaWeb项目中Servlet中无法创建数据库连接池问题
关于JavaWeb项目中Servlet中无法创建数据库连接池问题