【问题标题】:Java:ResultSet errorJava:结果集错误
【发布时间】:2014-02-18 05:50:27
【问题描述】:
    String temp[]=bookName.split(" ");
    ArrayList list=new ArrayList();

    try {
        con=ds.getConnection(); 
        pst=con.prepareStatement("select distinct book_name from booksinventory");
        rs=pst.executeQuery();

        for(int i=0;i<temp.length;i++)
        {
            while(rs.next())
            {
                //System.out.println(rs.getString(1)+" contains "+temp[i]);
                line no 631 --> System.out.println(rs.getString(1)+" contains "+temp[i]+":"+(rs.getString(1).toUpperCase()).contains(temp[i].toUpperCase()));
                if((rs.getString(1).toUpperCase()).contains(temp[i].toUpperCase()))
                {
                    list.add(rs.getString(1));
                    System.out.println(list);
                }
            }
            rs.beforeFirst();
        }
        System.out.println(list);
        Set<String> set=new HashSet<String>();
        set.addAll(list);
        list.removeAll(list);
        list.addAll(set);
        list.removeAll(Collections.singleton(null));

        con.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return list;

在这里,我试图搜索我的记录以检查记录中是否存在一组特定的关键字。我尝试了几乎所有方法都无法找出错误。我认为它与语句“rs.beforeFirst()”有关,因为它仅在第一次迭代时打印。以下来自控制台..

    16:55:06,240 INFO  [STDOUT] Let us C contains let:true
    16:55:06,240 INFO  [STDOUT] [Let us C]
    16:55:06,240 INFO  [STDOUT] Let us C++ contains let:true
    16:55:06,240 INFO  [STDOUT] [Let us C, Let us C++]
    16:55:06,240 INFO  [STDOUT] Let us HTML contains let:true
    16:55:06,240 INFO  [STDOUT] [Let us C, Let us C++, Let us HTML]
    16:55:06,240 INFO  [STDOUT] dfgdfg contains let:false
    16:55:06,240 INFO  [STDOUT] digital electronics contains let:false
    16:55:06,240 INFO  [STDOUT] java contains let:false
    16:55:06,241 INFO  [STDOUT] oops contains let:false
    16:55:06,241 INFO  [STDOUT] quantum computing contains let:false
    16:55:06,241 INFO  [STDOUT] sdf contains let:false
    16:55:06,241 ERROR [[SearchBooksCombo]] Servlet.service() for servlet SearchBooksCombo threw exception
    java.lang.NullPointerException
        at com.classes.dao.LibraryDAO.getMatchingBooks(LibraryDAO.java:631)
        at com.classes.servlets.SearchBooksCombo.doGet(SearchBooksCombo.java:37)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
        at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
        at org.apache.jsp.addCopy_jsp._jspService(addCopy_jsp.java:80)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
        at java.lang.Thread.run(Unknown Source)
    16:55:06,241 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException
        at com.classes.dao.LibraryDAO.getMatchingBooks(LibraryDAO.java:631)
        at com.classes.servlets.SearchBooksCombo.doGet(SearchBooksCombo.java:37)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
        at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
        at org.apache.jsp.addCopy_jsp._jspService(addCopy_jsp.java:80)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
        at java.lang.Thread.run(Unknown Source)
    16:55:06,242 INFO  [CachedConnectionManager] Closing a connection for you.  Please close them yourself: org.jboss.resource.adapter.jdbc.jdk5.WrappedConnectionJDK5@52fdeb
    java.lang.Throwable: STACKTRACE
        at org.jboss.resource.connectionmanager.CachedConnectionManager.registerConnection(CachedConnectionManager.java:290)
        at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:423)
        at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:849)
        at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:89)
        at com.classes.dao.LibraryDAO.getMatchingBooks(LibraryDAO.java:622)
        at com.classes.servlets.SearchBooksCombo.doGet(SearchBooksCombo.java:37)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:557)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:481)
        at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
        at org.apache.jsp.addCopy_jsp._jspService(addCopy_jsp.java:80)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
        at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 代码中哪一行是631?
  • LibraryDAO...检查它的对象是否被创建。
  • 它在第一次迭代中工作正常。在我的数据库中,我有像 Let us C、Let us C++ 等书籍。(我不参考它们:D)..当 bookName 包含“让我们”.. 它存储所有名称中带有“let”的书(如控制台中所示).. 但不会继续进行第二个迭代.. 可能是什么问题?
  • @Shoaib Chikate: LibraryDAO 本身不能是null,因为在方法getMatchingBooks 处有一个NPE in 这个类。但无论如何,行号可能很有趣......
  • @TimB 检查编辑..

标签: java servlets jdbc


【解决方案1】:

“因为它只打印第一次迭代。”

来自ResultSet javadoc

默认的ResultSet 对象不可更新,有一个只能向前移动的光标。因此,您只能从第一行迭代到最后一行。可以生成可滚动和/或可更新的 ResultSet 对象。下面的代码片段,其中con 是一个有效的Connection 对象,说明了如何创建一个可滚动的、对其他人的更新不敏感且可更新的结果集。有关其他选项,请参阅 ResultSet 字段。

   Statement stmt = con.createStatement(
                                  ResultSet.TYPE_SCROLL_INSENSITIVE,
                                  ResultSet.CONCUR_UPDATABLE);
   ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
   // rs will be scrollable, will not show changes made by others,
   // and will be updatable

【讨论】:

  • 糟糕!我怎么能忘记!谢谢 ! :)
【解决方案2】:

根据您发布的内容,这是我编写该课程的方式:

package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * BookDao description here
 * @author Michael
 * @link  http://stackoverflow.com/questions/21380043/javaresultset-error#21380043
 * @since 1/27/14 6:51 AM
 */
public class BookDao {


    public static final String SELECT_BOOK_NAMES = "select distinct book_name from booksinventory";
    private Connection con;

    public BookDao(Connection con) {
        this.con = con;
    }

    public List<String> getAllBookNamesByKeywords() throws SQLException {
        List<String> list = new ArrayList<String>();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = con.prepareStatement(SELECT_BOOK_NAMES);
            rs = ps.executeQuery();
            while(rs.next()) {
                list.add(rs.getString(1));
            }
        } finally {
            DatabaseUtils.close(rs);
            DatabaseUtils.close(ps);
        }
        return list;
    }
}

你做了很多不必要或不正确的事情。

【讨论】:

  • 由于搜索条件 (temp),您没有考虑将哪些书籍添加到列表中。除此之外,它实际上更清洁!
  • 这不会随着书名数量的增加而扩展。更好的解决方案是让数据库处理它擅长的事情。我认为一个更好的查询,也许是一个索引器,会更具可扩展性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多