简体   繁体   English

JDBC 连接的 Java 空指针异常

[英]Java Null Pointer Exception for JDBC Connection

I am trying to run a web application that gets a specific length of numbers from a user and checks that against a database (so if the user made a typo, it will makes suggestions as to what key the user actually meant).我正在尝试运行一个 Web 应用程序,该应用程序从用户那里获取特定长度的数字并根据数据库进行检查(因此,如果用户打错了字,它会就用户的实际意思提出建议)。 The problem I am running into is the application won't connect to the database, I get this error:我遇到的问题是应用程序无法连接到数据库,我收到此错误:


java.lang.NullPointerException java.lang.NullPointerException
at Validator.Validate.checkIDs(Validate.java:410)在 Validator.Validate.checkIDs(Validate.java:410)
at Validator.Validate.getAllValidIds(Validate.java:203)在 Validator.Validate.getAllValidIds(Validate.java:203)
at Python.WebServlet.processRequest(WebServlet.java:70)在 Python.WebServlet.processRequest(WebServlet.java:70)
at Python.WebServlet.doPost(WebServlet.java:247)在 Python.WebServlet.doPost(WebServlet.java:247)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1805)在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1805)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)在 java.lang.Thread.run(Thread.java:662)


Line 410 in Validator.Validate is: Validator.Validate 中的第 410 行是:

Statement stmt = Conn.createStatement();

Where Conn is a java.sql.Connection variable其中 Conn 是一个 java.sql.Connection 变量

Line 203 is a call to the method that does the ^ statement第 203 行是对执行 ^ 语句的方法的调用


java.lang.ClassNotFoundException: com.mysql.jdbc.Driver java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546)
at java.lang.Class.forName0(Native Method)在 java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)在 java.lang.Class.forName(Class.java:169)
at Validator.Validate.dbConnect(Validate.java:394)在 Validator.Validate.dbConnect(Validate.java:394)
at Validator.Validate.getAllValidIds(Validate.java:193)在 Validator.Validate.getAllValidIds(Validate.java:193)
at Python.WebServlet.processRequest(WebServlet.java:70)在 Python.WebServlet.processRequest(WebServlet.java:70)
at Python.WebServlet.doPost(WebServlet.java:247)在 Python.WebServlet.doPost(WebServlet.java:247)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1805)在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1805)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)在 java.lang.Thread.run(Thread.java:662)


This is the error I get on my server, if I run it on my local machine it works just fine (it validates the ID).这是我在服务器上遇到的错误,如果我在本地机器上运行它,它工作得很好(它验证 ID)。 What could be the problem here?这里可能有什么问题? Cannot it not locate the com.mysql.jdbc.Driver class?它不能定位 com.mysql.jdbc.Driver 类吗? Is that class the issue?那个班有问题吗?

Thanks for the advice/help in advance!感谢您提前提供建议/帮助!

NOTE:笔记:

The Validator class is an external jar that is in my class path. Validator 类是一个位于我的类路径中的外部 jar。 It calls on another jar in its class path the contains the com.mysql.jdbc classes, as you can see in the following pictures它调用包含 com.mysql.jdbc 类的类路径中的另一个 jar,如下图所示

当前在我的 netbeans 项目中的库


The BugValidator jar contains the mysql-connector jar which has the Drivers class BugValidator jar 包含具有 Drivers 类的 mysql-connector jar

BugValidator jar 的内容


mysql-connector-java-5.1.7-bin.jar 的内容

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

You'll have to include the MySQL JDBC-Driver in your server's classpath.您必须在服务器的类路径中包含MySQL JDBC-Driver
Either by publishing it with your application or putting it in your server's lib directory.通过将其与您的应用程序一起发布或将其放入服务器的lib目录中。

Hope this helps.希望这可以帮助。 Have Fun!玩得开心!

From this:由此:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

It's pretty clear that you don't have the MySQL driver on your ClassPath.很明显,您的 ClassPath 上没有 MySQL 驱动程序。 Somewhere in your project, you should have the jar that contains the MySQL driver.在您的项目中,您应该有包含 MySQL 驱动程序的 jar。 If you don't, then you either need to download it to your lib directory, or set up a Maven dependency to it, depending on how your projects dependencies are being handled.如果不这样做,那么您要么需要将其下载到您的 lib 目录中,要么需要为其设置 Maven 依赖项,具体取决于您的项目依赖项的处理方式。

EDIT: In response to your update.编辑:响应您的更新。 All your screenshot shows is that everything is set up fine for compilation within your IDE.您的所有屏幕截图都表明,一切都设置为可以在您的 IDE 中进行编译。 But we still don't know where you are running your application from that's giving you this stack trace.但是我们仍然不知道您在哪里运行您的应用程序,因为它会为您提供此堆栈跟踪。

Are you running your app from inside your IDE and getting the stack trace from the console?您是从 IDE 内部运行应用程序并从控制台获取堆栈跟踪吗? Are you running it after it's been packaged and seeing the stack trace in some logs?您是否在打包后运行它并在某些日志中看到堆栈跟踪?

Did you load the driver class??你加载驱动类了吗?

Class.forName("com.mysql.jdbc.Driver"); 

ie: IE:

Class.forName("com.mysql.jdbc.Driver"); 
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/karthicraj","mysql","mysql"); 
stm=con.createStatement(); 
String strQry="update sriram set age=?,salary=? where name=? and age=?"; 

Extracted from: http://forums.mysql.com/read.php?60,42473,275468#msg-275468摘自: http : //forums.mysql.com/read.php?60,42473,275468#msg-275468

The JDBC driver needs to go in the webapp's runtime classpath, not in some arbitrary /lib folder, let alone embedded in a different JAR file (that would also not work in normal Java applications by the way). JDBC 驱动程序需要进入 web 应用程序的运行时类路径,而不是任意的/lib文件夹,更不用说嵌入到不同的 JAR 文件中(顺便说一下,这也不适用于普通的 Java 应用程序)。

Put the libraries which the webapp requires during runtime individually in webapp's /WEB-INF/lib folder.将 webapp 在运行时需要的库单独放在 webapp 的/WEB-INF/lib文件夹中。


Unrelated to the concrete problem, please use package names according Java naming conventions .具体问题无关,请按照Java命名约定使用包名。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM