尝试从 servlet 调用 JDBC 时抛出 NullPointerException
Posted
技术标签:
【中文标题】尝试从 servlet 调用 JDBC 时抛出 NullPointerException【英文标题】:NullPointerException is thrown when trying to call JDBC from a servlet 【发布时间】:2012-08-02 22:48:49 【问题描述】:我正在运行我的 servlet RegistrationServlet
,并尝试创建一个数据库对象
这里是 servlet:
@WebServlet("/register")
public class RegistrationServlet extends HttpServlet
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException
// create a new connection to mysql database , with this we put the new client in the database
Database myDabatase = null;
try
myDabatase = new Database();
catch (ClassNotFoundException e)
e.printStackTrace();
// create a new database
myDabatase.createDatabaseAndTables(); // create the tables of the database
HttpSession session = request.getSession();
synchronized(session)
boolean returnValue = myDabatase.addNewClient("david", "cole", "jamie", "123456789", "johnny", "blabla");
if (returnValue == true) // client was added
String addressPath = "/WEB-INF/results/show-name.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(addressPath);
dispatcher.forward(request, response);
else if (returnValue == false) // client was not added becuase he's already registered
这是完整的课程:
但是当我在我的 servlet 中执行该行时:
boolean returnValue = myDabatase.addNewClient("david", "cole", "jamie", "123456789", "johnny", "blabla");
我得到一个 NullPointerException 说:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at db.Database.<init>(Database.java:18)
at servlets.RegistrationServlet.doGet(RegistrationServlet.java:28)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
这导致我排队:
Class.forName("com.mysql.jdbc.Driver");
在Database
类的构造函数中,正如您在跟踪跟踪中看到的那样:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
但是,当我执行与主程序相同的程序时:
public class Main
public static void main(String [ ] args) throws Exception
Database myConnection = new Database();
myConnection.createDatabaseAndTables();
boolean returnValue = myConnection.addNewClient("david", "cole", "jamie", "123456789", "johnny", "blabla");
一切正常,我没有得到 NullPointerException 。
那么如果我从一个 servelt 做同样的事情有什么问题呢?为什么是 NullPointerException ?
问候
【问题讨论】:
【参考方案1】:我在同一行中遇到了同样的问题,但我通过将用于 MySQL 连接的 JAR 添加到项目中解决了它。
之前,它没有包含在项目中,因为连接的所有数据都已添加到服务器配置(Payara Server 5)中,因此在服务器上显示项目时不会发生错误。但是,在 JUnit 中运行时没有考虑到这一点,因此需要添加 JAR 以直接从项目而不是从服务器进行连接。
我希望这对那些有同样问题的人有用。
【讨论】:
【参考方案2】:运行 servlet 时,类路径中缺少 MySQL 驱动程序。可能需要将带有驱动程序的 JAR 文件添加到您的 webapp 的 WEB-INF/lib 目录中。
【讨论】:
【参考方案3】:您的服务器容器的类路径中缺少 MySQL jar,而当您运行独立的主应用程序时它存在。
【讨论】:
我必须把jar
放在每个连接到 Mysql 的库中?
不确定您所说的“在每个图书馆中”是什么意思。每当执行连接到 MySQL 数据库的代码时,包含缺少的驱动程序类的 JAR 必须在类路径中。【参考方案4】:
确保 mysql 驱动程序 jar 位于您的 lib 文件夹中(或类路径,如果它的控制台应用程序)。尝试指定 mysql 的端口(如果没有更改,则为 3306)。
【讨论】:
以上是关于尝试从 servlet 调用 JDBC 时抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
Glassfish 管理控制台在创建 JDBC 池时抛出 java.lang.IllegalStateException
response.getOutputStream() 首次调用时抛出 IllegalStateException
Javasist 在检测 org.h2.jdbc.JdbcPreparedStatement 的 setString 方法时抛出 javassist.CannotCompileException