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)

楼主你把连接数据库写成构造器的形式,认为可以每次执行时都会连接,所以不在具体查询方法里面再做数据库的connection操作,这个方式显然发生错误了,建议不写成默认构造的形式。具体改法可以照我的例子改:
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的主要内容,如果未能解决你的问题,请参考以下文章

springboot中全局异常,系统配置

servlet连接数据库问题 报错问题

关于JavaWeb项目中Servlet中无法创建数据库连接池问题

关于JavaWeb项目中Servlet中无法创建数据库连接池问题

servlet中连接数据库问题: exception java.lang.NullPointerException

怎么在servlet中连接数据库?