我正在做一个图书检索系统,我的思路是地用户的请求参数处理生成sql语句对数据库进行查询,然后显示基本信息(书名,作者,出版社,索取号)。在显示的页面继续点击作者等查询数据库中有此作者写的书的信息。在此时点击作者继续查询每问题,但是电击出版社时就抛出了nullpointer的错误。麻烦大家看看代码有什么错误。直接在地址栏里输入http://localhost:8080/myweb/display.jsp?publisher="什么"就抛出“”无效的sql语句,但是输入http://localhost:8080/myweb/display.jsp?author="什么"就没问题
<body>
<jsp:useBean id="datacon" class="library.model.DataCon" />
<jsp:useBean id="booksbean" class="library.model.BooksBean" />
<jsp:useBean id="search" class="library.model.Search" />
<% String  sql=null;   
   String author=request.getParameter("author");
   String publisher=request.getParameter("publisher");
   String search_no1=request.getParameter("search_no");

 
 if(publisher!=null)
      {publisher=new String(publisher.getBytes("8859_1"));
          sql="select * from marcdata where publisher like '"+publisher+"%';";
          condition="?publisher="+publisher;
       }else publisher="";
 if(author!=null)
        {author=new String(author.getBytes("8859_1"));
           sql="select * from marcdata where author like '"+author+"%'";
           condition="?author="+author;
  }else author="";
     if(search_no1!=null){
           sql="select * from marcdata where search_no1 like '"+search_no1+"%'";
           condition="?search_no1="+search_no1;
      }else search_no1="";
   session.setAttribute("sqlone",sql);%>
<%=sql%> 
   <% search.setRowcount(sql);%>
  <% int rowcount=search.getRowcount();%>
   <TABLE width="800" border=0 cellPadding=0 cellSpacing=1>
<tr><td align="center"><h3>查询结果</h3></td></tr>
<tr>
<td align="center" height="10">共找到<%=rowcount%>条记录</td>
</tr>
<tr>
<td align="center" height="10">------------------------</td></tr>
</table>
 <% String currpage=request.getParameter("page"); 
   if(currpage==null)
  currpage="1";%>
  <span class="style1">第</span><%=currpage%><span class="style1">页</span>
  <TABLE BORDER=0 CELLPADDING=3 CELLSPACING=1 WIDTH=800 class=tb_sr>
<TR VALIGN="middle" class="th_sr" height=28>
   
   <TH>题名(副题名)</TH>
   <TH>作者</TH>
   <TH>出版信息</TH>
   <TH>索取号</TH></TR>
   
  
<%Vector bookbeans=search.searchbook(Integer.parseInt(currpage),rowcount,sql);%>
<% for(int i=0;i<bookbeans.size();i++)
                {
                        BooksBean bean=(BooksBean)bookbeans.elementAt(i); %>
    <tr>
    
    <td align=left class="td_sr" height=28>
      <a href="booksearch.jsp" ><%= bean.getBookname()%></a>
    </td>
    <td align=left class="td_sr" height=28>
      <a href="display.jsp?&author=<%=bean.getAuthor()%>"><%= bean.getAuthor()%></a>
    </td>
    <td align=left class="td_sr" height=28>
      <a href="display.jsp?&pulisher=<%=bean.getPublisher()%>"><%= bean.getPublisher()%></a>
    </td>
    <td align=left class="td_sr" height=28>
      <a href="display.jsp?&search_no1=<%=bean.getSearch_no1()%>"><%= bean.getSearch_no()%></a>
    </td>
  </tr>
   <% }%>
  
   
</TABLE>

解决方案 »

  1.   

    错误是这样的:
    org.apache.jasper.JasperException
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause java.lang.NullPointerException
    java.lang.String.<init>(String.java:141)
    org.apache.jsp.display_jsp._jspService(display_jsp.java:154)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
      

  2.   

    我改了一下连接的jsp文件名后,连作者都抛出这个异常了
      

  3.   

    你这个publisher参数是怎么传过来的啊,上个页面的action或者<a href></a>的指定连接你这个页面,否则你的getParameter是找不到的,他的作用范围是有限制的。
      

  4.   

    上一个页面的查询循环结果<td align=left class="td_sr" height=28>
          <a href="display.jsp?&pulisher=<%=bean.getPublisher()%>"><%= bean.getPublisher()%></a>
        </td>
    ```````我对三个if做了个单独的测试,结果sql输出的值只对第一个if的参数有效,第一个if以下全为空值```不知道为什么
      

  5.   

    有选择性传参???
    那你这个是怎么回事: 
    String author=request.getParameter("author");
       String publisher=request.getParameter("publisher");
       String search_no1=request.getParameter("search_no");
    上个页面要是传过来个"",nullpointException不是很正常
      

  6.   

    <a href="display.jsp?&pulisher=<%=bean.getPublisher()%>"><%= bean.getPublisher()%></a>
    这句应该不要这个 & 符号吧
      

  7.   

    改过来还是出现了抛出错误?
    java.lang.NullPointerException
    oracle.jdbc.driver.OracleSql.parse(OracleSql.java:63)
    oracle.jdbc.driver.OracleConnection.nativeSQL(OracleConnection.java:1086)
    oracle.jdbc.driver.OracleStatement.expandSqlEscapes(OracleStatement.java:5703)
    oracle.jdbc.driver.OracleStatement.parseSqlKind(OracleStatement.java:5692)
    oracle.jdbc.driver.OracleStatement.doScrollStmtExecuteQuery(OracleStatement.java:6207)
    oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:640)
    library.model.Search.setRowcount(Search.java:22)
    org.apache.jsp.display_jsp._jspService(display_jsp.java:180)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)这是我刚开始出现的错误,在发帖子的时候,改了一下,没删除&
      

  8.   

    那看这个异常应该是你连接数据库时 Connection 没有获得到值,你在你连接数据库的地方把你 Connection 打印一下,看有没有连接上数据库
      

  9.   

    连接在search类里已经实现了,如果没有 连接的话就不可能查到作者,但是现在的问题就是出版社的信息查不到,我想还是sql 变量传递的是空值,Search类有两个方法,一个是返回查询的总数,一个是返回一出巡结果vector集合。
      

  10.   

    空指针错误 Java.lang.NullPointerException   使用基本的Java数据类型,变量的值要么已经是默认值,如果没有对其正常赋值,程序便不能通过编译,因此使用基本的Java数据类型(double,float,boolean,char,int,long)一般不会引起空指针异常。 
    由此可见,空指针异常主要跟与对象的操作相关。 
    下面先列出了可能发生空指针异常的几种情况及相应解决方案:   不管对象是否为空就直接开始使用。   (JSP)代码段1: 
      out.println(request.getParameter("username"));   描述:   代码段1的功能十分简单,就是输出用户输入的表域"username"的值。   说明:   看上去,上面的语句找不出什么语法错误,而且在大多数情况下也遇不到什么问题。但是,如果某个用户在输入数据时并没有提供表单域"username"的值,或通过某种途径绕过表单直接输入时,此时request.getParameter("username")的值为空(不是空字符串,是空对象null。),out对象的println方法是无法直接对空对象操作,因此代码段1所在的JSP页面将会抛出"Java.lang.NullPointerException"异常。   即使对象可能为空时,也调用Java.lang.Object或Object对象本身的一些方法如toString(), equals(Object obj)等操作。   (JSP)代码段2: 
      String userName = request.getParameter("username");   If (userName.equals("root"))   {....}   描述:   代码段2的功能是检测用户提供的用户名,如果是用户名称为"root"的用户时,就执行一些特别的操作。   说明:   在代码段2中,如果有用户没有提供表单域"username"的值时,字符串对象userName为null值,不能够将一个null的对象与另一个对象直接比较,同样,代码段2所在的JSP页面就会抛出(Java.lang.NullPointerException)空指针错误。   (JSP)代码段3: 
      String userName = session.getAttribute 
      ("session.username").toString();   描述:   代码段3的功能是将session中session.username的值取出,并将该值赋给字符串对象 userName。   说明:   在一般情况下,如果在用户已经进行某个会话,则不会出现什么问题;但是,如果此时应用服务器重新启动,而用户还没有重新登录,(也可能是用户关闭浏览器,但是仍打开原来的页面。)那么,此时该session的值就会失效,同时导致session中的session.username的值为空。对一个为null的对象的直接执行toString()操作,就会导致系统抛出(Java.lang.NullPointerException)空指针异常。   解决方案:   为了确保进行操作或引用的对象非空,假若我们要对某对象进行操作或引用,我们首先去检查该对象是否已经实例化且不为空;并且在系统中加入针对对象为空时情况的处理。   如:采用String对象保存用户提交的结果;在如果涉及对象的操作时,先检测其是否为空后,检查到对象为空后,可再选择进行以下任一种处理方式:   处理方式 1) 检查到对象为空时,设置对象值为空字符串或一个默认值;   处理方式 2) 检测到对象为空时,根本不执行某操作,直接跳转到其他处理中。   处理方式 3) 检查到对象为空时,提示用户操作有错误。   将代码段2按以上方式进行改写,得到:   方式1: 
      String userName = request.getParameter("username");   // 该变量值为空时,转化为默认空字符串   If (userName == null)   userName = "";   If (userName.equals("root"))   {..........} 
    方式2: 
      String userName = request.getParameter("username");   // 该变量值为空时,转化为默认空字符串,不执行有关操作。   If (usreName != null)   {   If (userName.equals("root"))   {..........}   }   方式3: 
      String userName = request.getParameter("username");   // 该变量值为空时,转化为默认空字符串,不执行有关操作 If (usreName == null)   {   // 提示用户输入信息为空   }   实际中,上面提供到三种处理方式也同样适用于其他异常的处理:   异常处理方式 1) 检查到异常出现,设置对象值为空字符串或一个默认值;   异常处理方式 2) 检测到异常出现,根本不执行某操作,直接跳转到其他处理中。   异常处理方式 3) 检查到异常出现,提示用户操作有错误。   2,格式化数字错误 Java.lang.NumberFormatException分析   (JSP)代码段3: 
      String s_memberid = request.getParameter("memberid");   int i_memberid = Integer.parseInt(s_memberid);   描述:   以上代码段的作用是将用户提交的表单域memberid的值转化为整数。   说明:   如果用户输入正确的数字如:1082,不会有什么问题。然而,如果用户输入T1082时,由于T1082不是合法的数字格式,Java无法将其转化为合适的数字,导致抛出Java.lang.NumberFormatException数字格式化异常。   解决方案:   在任何用到字符串转化为数字时,捕捉异常,对异常情况进行处理按异常处理方式1:检查到异常发生,即赋给某变量一个默认值;(可能在某些情况下导致一其他程序错误[比方说其他模块中并未处理您所赋予的默认值情况,可能导致一些异常或错误出现。])按异常处理方式3:检查到异常发生,提示用户使用正确的数字格式输入。(实现稍微麻烦一点,但是将错误阻挡在您的模块前[即您提供给其他模块的值均是安全的]。)按这种方法对程序进行改写,在编程时稍微麻烦一点,但这的确会您的模块更加健壮。将代码段3按以上要求进行改写,得到: 
      String s_memberid = request.getParameter("memberid");   int i_memberid;   try   {   i_memberid = Integer.parseInt(s_memberid);   ...   }   catch(NumberFormatException nfe)   {   //方式1:(简单,直接给该编号为一个默认值0;)   i_memberid = 0;   //方式2:(很简陋的做法,建议使用更友好的提示方式)   out.println(" ");   } 
      

  11.   

    希望能从上面得到启发,这个问题我也考虑到了,继续研究java
      

  12.   

    我的处理方法是一般加上比较多的判别条件,不知行不行:
    String author=request.getParameter("author");
    if(author==null||author.length()==0||author=="")author=request.getParameter("author");
    else author="default"
      

  13.   

    经过我的努力,我已经搞定 了,开始是以为在jsp里写脚本会有什么bug,尝试了servlet和jstl,结果发现是我的粗心所导致的错误,在这里我向那些热心的朋友们说声歉意,不过还是学了不少东西,thank you all the same!