Java 准备好的语句在替换为语句时不起作用?

Java 准备好的语句在替换为语句时不起作用?,java,mysql,jdbc,Java,Mysql,Jdbc,下面是我使用JDBC的代码,为了使查询运行更快,我用PrepareStatement替换了语句,但是页面没有运行。我做错了什么 代码: 错误: java.lang.NullPointerException at org.apache.jsp.election_005fresults_jsp._jspService(election_005fresults_jsp.java:267) at org.apache.jasper.runtime.HttpJspBase.service(

下面是我使用JDBC的代码,为了使查询运行更快,我用PrepareStatement替换了语句,但是页面没有运行。我做错了什么

代码:

错误:

java.lang.NullPointerException
    at org.apache.jsp.election_005fresults_jsp._jspService(election_005fresults_jsp.java:267)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Unknown Source)

控制台中显示以下错误。有人能告诉我错误是什么吗??

是-您的强制转换将失败(出现异常),然后您无条件地调用
finally
块中的
stmt.close()
,即使
stmt
仍然为空。。。因此出现了
NullPointerException

基本上,不要这样做-使用
con.prepareStatement(…)
来创建
PreparedStatement
con.createStatement()
根本无法创建
PreparedStatement
,因此以后再强制转换它是行不通的。如果您确实不想使用
PreparedStatement
,只需将
stmt
变量更改为
Statement
类型,而不是
PreparedStatement
——但我个人建议在任何地方都使用
PreparedStatement


在调用
close
之前,您还应该改进finally块以检查null,或者(更好)如果您使用的是Java 7,则使用try with resources语句。

在您使用的代码中

(PreparedStatement)con.createStatement();
它返回语句对象

你需要

con.prepareStatement("query");

要获取PreparedStatement对象,请使用jstl。将控制器和DAO分开,并将逻辑保留在服务器中。请在将来花更多时间格式化您的问题。没有必要水平滚动这么多…@Jon Skeet我怎样才能让我的查询运行得更快???有什么办法吗???@user3332446查看一套好的优化技巧和技术。@user3332446:这是一个完全不同的问题,当然,仅仅使用
createStatement
而不是
prepareStatement
是无法实现的。我建议您提出一个新问题,包括有关数据库模式的所有相关信息、您有多少数据、它是什么类型的数据库、您执行了什么性能诊断等。这个问题不是关于性能,而是关于正确性。
(PreparedStatement)con.createStatement();
con.prepareStatement("query");