我做了一个成绩查询页面,想在显示所有成绩页面添加删除功能,删除功能根据学号和课程名删除成绩。我上网查了很多资料,做了很多修改,但是依然报错
代码如下:
<% request.setCharacterEncoding("GBK"); %>
<%@ page language="java" import="com.cj.*,java.util.*,java.io.*,java.lang.*" pageEncoding="GBK"%>
<jsp:useBean id="cjBean" class="com.cj.CjBean" scope="session"/>
<html>
  <head>
   
    <link href="../CSS/div.css" type="text/css" rel=stylesheet>
  </head>
  
  <body> 
  <%@ include file="admin_top.jsp"  %>
  <div id="Menu">
<div id="Nav">
<ul>
<li><a href="admin_cj_addcjmain.jsp">添加成绩</a></li>
<li><a href="admin_cj_searchcj.jsp">根据学号查询成绩</a></li>
<li><a href="admin_cj_viewadllcj.jsp">查看所有成绩列表</a></li>
</ul>
</div>
</div>
   <div id="info_table">
    
                <font size="4"><center>查看所有成绩</center></font>
                 <table width=91% border="1" align="center" bordercolor="#00addf" bgcolor="#00addf">
<tr bgcolor="#00addf" bordercolor="#00addf">
<td width="11%"><div align="center" ><strong>学号</strong></div></td>
<td width="13%"><div align="center" >科目</div></td>
<td width="13%"><div align="center" >成绩</div></td>
<td width="26%"><div align="center" >删除此成绩</div>  </td>
</tr>
                
                
                <%

          String n=new String(request.getParameter("subjectName").getBytes("8859_1"),"GBK");
        

      String s=(String)request.getParameter("studentId");
      out.println(s);
                      out.println(n); 
    
    
if(s!=null&&n!=null){
cjBean.deleteCj(s,n);
}

Collection<CJClass> cj = cjBean.getAllCjInfo();
Iterator<CJClass> it = cj.iterator();

while(it.hasNext())
{
    CJClass cjClass=(CJClass)it.next();
out.println("<tr bgcolor=#FFFFFF bordercolor=#00addf>");
out.println("<td width='11%'><div align=center ><strong>"+cjClass.getStudentId()+"</strong></div></td>");
out.println("<td width='13%'><div align=center >"+cjClass.getSubjectName()+"</div></td>");
out.println("<td width='13%'><div align=center >"+cjClass.getSubjectScore()+"</div></td>");
out.println("<td><div align=center class=style13><a href='admin_cj_viewadllcj.jsp?studentId="+cjClass.getStudentId()+"&subjectName="+java.net.URLEncoder.encode(cjClass.getSubjectName())+"'>删除</a></div></td>");
out.println("</tr>");
}
    
      
     
      
%>
</table>
               
         </div>
     
  </body>
</html>
报错内容:
严重: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.admin.admin_005fcj_005fviewadllcj_jsp._jspService(admin_005fcj_005fviewadllcj_jsp.java:165)
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:393)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
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.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)在线求助急急

解决方案 »

  1.   

    你在硬盘上搜一下admin_005fcj_005fviewadllcj_jsp.java文件(一般在Tomcat工作目录下),看165行是JSP中哪一行,再分析问题所在。
      

  2.   

    仔细检查检查值吧,还有那个iso8859-1
      

  3.   

    回1楼,admin_005fcj_005fviewadllcj_jsp.java我没搜到,我用的环境是 Myeclipse8.5 +sql server2005 tomcat  回2楼,out.println("<td width='13%'><div align=center >"+cjClass.getSubjectName()+"</div></td>");这个直接显示能正确显示,但是一传递就不行了。。
      

  4.   

    我是按照网上这个方法弄的。
    中文作为参数传递乱码   当我们把一段中文字符作为参数传递个另一页面时,也会出现乱码情况,解决方法如下:   在参数传递时对参数编码,比如 
    RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords) 
      然后在接收参数页面使用如下语句接收 
     keywords=new String(request.getParameter("keywords").getBytes("8859_1"));  请问 keywords该用什么类型声明?不声明好像会报错求救啊
      

  5.   

    我也是这样想的,但是用String就报我上面发的空指针异常错误毫无头绪。。
      

  6.   

    有一个办法,也是最近新学的,你可以试试看!!你打开tomcate目录找到conf文件夹--》server文件--》ctrl+f(搜索快捷键)  搜索8080之后你会看到一些没有被注释掉的蓝色代码在redirectPort="8443"或者是什么别的数字,后面加上Encording="gbk" 之后保存,你再试试!不用那种很长的方法,好像连requset编码方式都不需要设置,直接就能接受中文了!呵呵试试吧,应该这是最简单最方便的了
      

  7.   

    修正:
    有一个办法,也是最近新学的,你可以试试看!!你打开tomcate目录找到conf文件夹--》server文件--》ctrl+f(搜索快捷键) 搜索8080之后你会看到一些没有被注释掉的蓝色代码在redirectPort="8443"或者是什么别的数字,后面加上 URIEncoding="gbk" 之后保存,你再试试!不用那种很长的方法,好像连requset编码方式都不需要设置,直接就能接受中文了!呵呵试试吧,应该这是最简单最方便的了
      

  8.   

    String n=new String(request.getParameter("subjectName").getBytes("8859_1"),"GBK");
    这句很有可能有问题,
    最有可能:request.getParameter("subjectName") == null
    自己写个
    System.out.println(request.getParameter("subjectName"));
    查看一下是不是为NULL.
      

  9.   

    是在所有 8080或者 8443 8009什么的 后面加  Encording="gbk" 这个么?  
      

  10.   

    回9楼,我现在一点进去这个页面直接报错,我都没机会试验是不是为NULL
      

  11.   

    我把转换编码的代码去掉了  就是乱码。
    代码如下。
    <% request.setCharacterEncoding("GBK"); %>
    <%@ page language="java" import="com.cj.*,java.util.*,java.io.*,java.lang.*" pageEncoding="GBK"%>
    <jsp:useBean id="cjBean" class="com.cj.CjBean" scope="session"/>
    <html>
      <head>
       
        <link href="../CSS/div.css" type="text/css" rel=stylesheet>
      </head>
      
      <body> 
      <%@ include file="admin_top.jsp"  %>
      <div id="Menu">
    <div id="Nav">
    <ul>
    <li><a href="admin_cj_addcjmain.jsp">添加成绩</a></li>
    <li><a href="admin_cj_searchcj.jsp">根据学号查询成绩</a></li>
    <li><a href="admin_cj_viewadllcj.jsp">查看所有成绩列表</a></li>
    </ul>
    </div>
    </div>
       <div id="info_table">
        
                    <font size="4"><center>查看所有成绩</center></font>
                     <table width=91% border="1" align="center" bordercolor="#00addf" bgcolor="#00addf">
    <tr bgcolor="#00addf" bordercolor="#00addf">
    <td width="11%"><div align="center" ><strong>学号</strong></div></td>
    <td width="13%"><div align="center" >科目</div></td>
    <td width="13%"><div align="center" >成绩</div></td>
    <td width="26%"><div align="center" >删除此成绩</div>  </td>
    </tr>
                    
                    
                    <%

              String n=request.getParameter("subjectName");
            

          String s=(String)request.getParameter("studentId");
          out.println(s);
                          out.println(n); 
        
        
    if(s!=null&&n!=null){
    cjBean.deleteCj(s,n);
    }

    Collection<CJClass> cj = cjBean.getAllCjInfo();
    Iterator<CJClass> it = cj.iterator();

    while(it.hasNext())
    {
        CJClass cjClass=(CJClass)it.next();
    out.println("<tr bgcolor=#FFFFFF bordercolor=#00addf>");
    out.println("<td width='11%'><div align=center ><strong>"+cjClass.getStudentId()+"</strong></div></td>");
    out.println("<td width='13%'><div align=center >"+cjClass.getSubjectName()+"</div></td>");
    out.println("<td width='13%'><div align=center >"+cjClass.getSubjectScore()+"</div></td>");
    out.println("<td><div align=center class=style13><a href='admin_cj_viewadllcj.jsp?studentId="+cjClass.getStudentId()+"&subjectName="+cjClass.getSubjectName()+"'>删除</a></div></td>");
    out.println("</tr>");
    }
        
          
         
          
    %>
    </table>
                   
             </div>
         
      </body>
    </html>
      

  12.   

    那很明显楼主的这句话有问题
    String n=new String(request.getParameter("subjectName").getBytes("8859_1"),"GBK");如果request.getParameter("subjectName") 不为空
    request.getParameter("subjectName").getBytes("8859_1")这句话得到的肯定为NULL如下语句
    String s = new String(s1,"GBK");
    如果s1为空是要报空指针异常的错误的。
    楼主是不是通过像这样的URL访问:
    http://127.0.01:8080/xxx.jsp?arg1=科目
    也就是在URL的参数列表中带了中文???
      

  13.   

    首先你确定一下你url中的参数是否都接收到了..做个打印先...
      

  14.   

    没http://localhost:8080/CJCX/admin/admin_cj_viewadllcj.jsp 
      

  15.   

    17楼那个 我用//标示的地方就是打印的URL传递参数 结果有中文的是乱码
      

  16.   

    楼主的问题很怪
    如下JSP<%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding="GB18030"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
    <%
    String a = request.getParameter("arg1");
    a = new String(a.getBytes("8859_1"),"GBk");
    System.out.println(7);//sds
    System.out.println(a);
    %>
    <form action="">
    <input type="text" name="arg1" value="中国"/>
    <input type="submit" value="提交"/>
    </form>
    </body>
    </html>
    无论是通过点提交访问,还是通过以下两种链接访问
    http://localhost:8080/TempWeb/index.jsp?arg1=%D6%D0%B9%FA
    http://localhost:8080/TempWeb/index.jsp?arg1=中国我都没出现过乱码,奇怪中!!......
      

  17.   

    我按22楼方法 编译了一次,一点进那个页面就报错。空指针异常提示错误代码 
    a = new String(a.getBytes("8859_1"),"GBk"); 这段 。。郁闷中。。
    会不会是传递的页面有限制的 ,我是本页面传给本页面的
      

  18.   

    楼主请把你的这句:
    String n=new String(,"GBK");
    修改为以下:String n = request.getParameter("subjectName");
    System.out.println("1:"+n);
    byte b = n.getBytes("8859_1");
    System.out.println("2:"+b);
    n = new String (b,"GBK");
    System.out.println("3:"+n);
    然后运行,检查一下控制台的输出。看三个System.out.println输出什么东西
      

  19.   


    大哥,你访问要带参数的,我写那个代码你要带个参数访问,没参数当然异常了!!!!
    请用这两种方式中的任意一种:
    http://localhost:8080/TempWeb/index.jsp?arg1=%D6%D0%B9%FA
    http://localhost:8080/TempWeb/index.jsp?arg1=中国具体应该是什么地址,求你自己修改一下!!!!!
      

  20.   

    25楼,不是全按照你的复制,只是模仿你那个方法改了一下我的代码,URL的话我是直接从登陆界面进去然后到分页面的
    24楼那段代码报错,
    byte b = n.getBytes("8859_1");
    Type mismatch: cannot convert from byte[] to byten = new String(b,"GBK"); 
    The constructor String(byte, String) is undefined
      

  21.   

    24楼代码应该是String n = request.getParameter("subjectName");
    System.out.println("1:"+n);
    byte[] b = n.getBytes("8859_1");
    System.out.println("2:"+b);
    n = new String (b,"GBK");
    System.out.println("3:"+n);
      

  22.   

    1  <%  String n=request.getParameter("subjectName");
    2      n=new String(n.getBytes("8859_1"),"GBK");
    3      String s=(String)request.getParameter("studentId");
    4      out.println(s);
    5      out.println(n); 
    6      if(s!=null&&n!=null){
    7  cjBean.deleteCj(s,n);
    8 }
    9 Collection<CJClass> cj = cjBean.getAllCjInfo();
    10 Iterator<CJClass> it = cj.iterator();
    11 while(it.hasNext())
    12 {
    13 CJClass cjClass=(CJClass)it.next();
    14 out.println("<tr bgcolor=#FFFFFF bordercolor=#00addf>");
    15 out.println("<td width='11%'><div align=center<strong>"+cjClass.getStudentId()+"</strong></div></td>");
    16 out.println("<td width='13%'><div align=center >"+cjClass.getSubjectName()+"</div></td>");
    17 out.println("<td width='13%'><div align=center >"+cjClass.getSubjectScore()+"</div></td>");
    18 out.println("<td><div align=center class=style13><a href='admin_cj_viewadllcj.jsp?studentId="+cjClass.getStudentId()+"&subjectName="+cjClass.getSubjectName()+"'>删除</a></div></td>");
    19 out.println("</tr>");
    20 }因为显示全部成绩是通过循环本页面查询输出实现的
    我的想法是 当使用 18行 删除功能使  传递 studentId和subjectName回本页面 调用6、7行的删除Bean来删除该行成绩
      

  23.   

    感谢trocp,帮我忙活了这么久。。27楼进入页面报错
    org.apache.jasper.JasperException: An exception occurred processing JSP page /admin/admin_cj_viewadllcj.jsp at line 4138: 
    39:           String n = request.getParameter("subjectName");
    40:   System.out.println("1:"+n);
    41:   byte[] b = n.getBytes("8859_1");
    42:   System.out.println("2:"+b);
    43:   n = new String (b,"GBK");
    44:   System.out.println("3:"+n);
    Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:435)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    root cause java.lang.NullPointerException
    org.apache.jsp.admin.admin_005fcj_005fviewadllcj_jsp._jspService(admin_005fcj_005fviewadllcj_jsp.java:167)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
      

  24.   

    严重: Servlet.service() for servlet jsp threw exception
    java.lang.NullPointerException
    at org.apache.jsp.admin.admin_005fcj_005fviewadllcj_jsp._jspService(admin_005fcj_005fviewadllcj_jsp.java:167)
    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:393)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    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.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
      

  25.   

    String n = request.getParameter("subjectName");
    try{
    System.out.println("1:"+n);
    byte[] b = n.getBytes("8859_1");
    System.out.println("2:"+b);
    if(b!= null){
        n = new String (b,"GBK");
        System.out.println("3:"+n);
    }
    }catch(Exception e){
        System.out.println("4:"+n);}
      

  26.   

    因为request.getParameter("subjectName").getBytes("8859_1")得到的是空,
    所以new String (null,"GBK")报错。
      

  27.   

    最后你给的那段代码控制台输出是
    1:null
    4:null
    1:???§
    2:[B@15dc37d
    3:数学
      

  28.   

    那原因就是
    request.getParameter("subjectName")为null
    null.getBytes("8859_1") 同样报错,
    在你有应用中,可能存在第一次访问时页面时,确实没subjectName这个参数的值,而下一次访问时才传入了参数subjectName的值。
    控制台先输出
    1:null
    4:null
    说明request.getParameter("subjectName") 的结果是 null输出
    1:???§
    2:[B@15dc37d
    3:数学
    说明:传入了参数,没有转码是[???§]
    [B@15dc37d是那个byte[]的对象引用
    转码后是“数学”