我正在做一个图书检索系统,我的思路是地用户的请求参数处理生成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>
<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>
解决方案 »
- 本人亲自制作的springMVC教程视频(5),持续更新中
- jsp中能监听request的行为么?
- b/s 的程序如何实现固话拨号。。
- 雪地里跪求 验证码
- JSP中不需要捕获异常吗?
- csdn的博客文章正文格式为什么很乱,没有回车?
- 一个关于文件上传的问题
- 很棘手的问题:JSP 实现图形化数字 运行时抛出IllegalStateException异常 怎么去掉异常
- 使用javamail发送邮件多个收件人,邮件正文中参数问题
- 为什么Controller中接收不到的POST传来的请求?
- 关于submit的问题。
- 这段程序性能上有什么问题?(把数据库的数据放到HashMap.ArrayList.再查找)
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)
<a href="display.jsp?&pulisher=<%=bean.getPublisher()%>"><%= bean.getPublisher()%></a>
</td>
```````我对三个if做了个单独的测试,结果sql输出的值只对第一个if的参数有效,第一个if以下全为空值```不知道为什么
那你这个是怎么回事:
String author=request.getParameter("author");
String publisher=request.getParameter("publisher");
String search_no1=request.getParameter("search_no");
上个页面要是传过来个"",nullpointException不是很正常
这句应该不要这个 & 符号吧
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)这是我刚开始出现的错误,在发帖子的时候,改了一下,没删除&
由此可见,空指针异常主要跟与对象的操作相关。
下面先列出了可能发生空指针异常的几种情况及相应解决方案: 不管对象是否为空就直接开始使用。 (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(" "); }
String author=request.getParameter("author");
if(author==null||author.length()==0||author=="")author=request.getParameter("author");
else author="default"